equals == hashcode 的区别 迁移
equals
信息
equals
方法是基类 Object
中的实例方法,因此对所有继承于 Object
的类都会有该方法,他用来判断两个对象的内存地址是否一致
java
public boolean equals(Object obj) {
return (this == obj);
}
关系操作符 ==
信息
若操作数的类型是基本数据类型,则该关系操作符判断的是左右两边操作数的值是否相等
若操作数的类型是引用数据类型,则该关系操作符判断的是左右两边操作数的内存地址是否相同。也就是说,若此时返回 true
,则该操作符作用的一定是同一个对象。
hashcode
信息
在 Java
中,由 Object
类定义的 hashcode
方法会针对不同的对象返回不同的整数。(这是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧)
equals 与 ==
由 Object
类的定义可以看出 默认的 equals
方法和==并无差别,但是可以在子类中重写 equals
方法,增加自己不同的判断
equals 与 hashcode
equals
是比较两个对象的地址是否相同,而 hashcode
是针对不同的对象返回一个整数,如果 hashcode
的算法不是很好会出现两个不相同的对象出现相同的 hashcode
警告
在类中重写 equals
方法的时候必须要重写类的 hashcode
方法,不然会导致 equals
相等的两个对象 hashcode
值不同 这样是不被允许的
信息
如果两个对象相等,那么它们的哈希值一定相同。如果两个对象的哈希值相同,这个两个对象不一定相等
Q/A
为什么两个对象有相同的 hashcode
值,它们也不一定是相等的? 一句话hash碰撞
因为 hashcode
所使用的杂凑算法也许刚好会让多个对象传回相同的杂凑值。越糟糕的杂凑算法越容易碰撞,但这也与数据值域分布的特性有关(所谓碰撞也就是指的是不同的对象得到相同的 hashcode
。)