java中两个对象equals()不相同,但hashcode()却可能相等

equals()和hashcode()这两个方法都是从Object类中继承过来的。

equals()方法在Object类中定义如下:
public boolean equals(Object obj) {
return (this == obj);
}
是对两个对象的地址值进行的比较(即比较引用是否相同)。

但是String 、Math、还有Integer、Double等封装类使用equals()方法时,已经覆盖了object类的equals()方法。

为什么不同的对象hashcode可能相同:

因为当输入数据量太大,哈希值却是固定32长度的,这意味着哈希值是一个有限集合,无法建立一对一关系,所以hashcode相等是有可能会发生的。

两者的关系:

equals()相等的两个对象,hashcode()一定相等;
equals()不相等的两个对象,hashcode()有可能相等。
hashcode()不等,一定能推出equals()也不等;
hashcode()相等,equals()可能相等,也可能不等。

为什么用hashCode:
hashCode()效率是比equals()效率高的。
所以HashSet判断元素是否相等时先用hashCode()判断,如果hashCode()不同,则对象不等,如果hashCode()相同,再比较equals() ,大大提高了效率。

所以我们要保证如果重写了equals(),也要重写hashCode()。

你可能感兴趣的:(Java)