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。)