【从零单排】Java双等号,Equals(),HashCode()小结

默认情况 

- 双等号==,比较的是内存地址。
- equals(),默认比较的是内存地址。
- hashCode(),默认返回的是object的内存地址。

String中方法改写的情况

经常会遇到需要override equals()和hashCode()的情况,比如String就改写了这两个方法。
 
String equals() 的实现是首先判断两个字符串内存空间是否一致,然后对每一位字符进行比较。
String hashCode() 的实现是对每一位字符*31然后累加。

Equals()和HashCode()的契约

Java中两者有一个契约:
- 如果两个对象相等的话,即equals()返回true的时候,它们的hashCode()必须相等。
- 但如果两个对象的hashCode()相等的话,这两个对象(用equals()判断)不一定相等。
 
举例来说,在HashMap中存取键值对的时候用到了这两个方法:
- 用hashCode()计算Entry在数组中的位置
- 可能出现碰撞的情况,即多个Entry的hash code相同,存在同一个”格”中
- 这时,需要用equals()来判断key是否相同
 
一般来说equals()和hashCode()的override都是绑定出现的,因为要保证上述的契约关系。

参考

posted @ 2017-10-10 14:31  MaxStack  阅读(333)  评论(0编辑  收藏  举报