默认情况
- 双等号==,比较的是内存地址。
- 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都是绑定出现的,因为要保证上述的契约关系。