自定义对象作为map哈希表的 键key 时【为啥建议要重写hashCode()、equals() 方法】
1,为啥建议要重写hashCode()?
■ 为啥要重写hashCode(); //不重写,默认是比较内存地址。
✿ hashCode() 什么时候用、hashCode() 的作用? ---生成【哈希表(数组)】索引
ps:哈希表【本质上就是一个数组【索引-> 存储结点元素】】 ● 索引:是先将计算得到的哈希值,与数组长度 & 【也可以%,不过效率不高】得出。 ● 细节:计算出来得到的哈希值不同,但是经过&运算【结合考虑到数组长度】 |
2,为啥建议要重写 equals() 方法?
■ 为啥要重写equals(); //不重写,默认是比较内存地址。
✿ equals() 什么时候用、equals() 的作用 ? ---解决hashCode 冲突时,比较两个key是否相等
3,疑惑:为啥要重写 equals(); 使用哈希值【即只重写hashCode()方法】比较不行吗?
当key 不同【例如key的类型不同,String、Integer最后可能算出来相同的hashCode】时,可能算出来相同的哈希值,可以得到相同的索引。导致新的【key-value】结点覆盖到原的【key-value】结点,发生hashCode冲突。
//重写equals() 用来比较两个对象【例如两个对象的引用作为 key 存储在哈希表map 中,重写equals() 就可以比较key 是否相等。】