自定义对象作为map哈希表的 键key 时【为啥建议要重写hashCode( )、equals( ) 方法】

自定义对象作为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 是否相等。】

原文地址:https://www.cnblogs.com/shan333/p/15502536.html