Skip to content

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