默认的 .equals 和 .hashCode 如何适用于我的类?

2022-08-31 08:56:16

假设我有自己的班级

public class MyObj { /* ... */ }

它具有一些属性和方法。它不实现等于,不实现哈希码。

一旦我们调用 equals 和 hashCode,默认的实现是什么?从对象类?它们是什么?默认值等于将如何工作?默认哈希代码将如何工作以及返回什么?==将只检查它们是否引用相同的对象,所以这很容易,但是 equals() 和 hashCode() 方法呢?


答案 1

是的,默认的实现是Object的(一般来说;如果你从一个重新定义了等于和/或hashCode的类继承,那么你将改用该实现)。

从文档中:

equals

类 Object 的 equals 方法在对象上实现最有区别的可能等价关系;也就是说,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一对象(x == y 的值为 true),此方法才返回 true。

hashCode

尽管合理实用,但由类 Object 定义的 hashCode 方法确实为不同的对象返回不同的整数。(这通常是通过将对象的内部地址转换为整数来实现的,但 JavaTM 编程语言不需要这种实现技术。


答案 2

其中一个 JVM 实现中的对象:

public boolean equals(Object object) {
    return this == object;
}

public int hashCode() {
    return VMMemoryManager.getIdentityHashCode(this);
}

在这两种情况下,它只是比较相关对象的内存地址。