对于我的类,default.equals 和. hashCode 是如何工作的?

假设我有自己的课

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

它有一些属性和方法。

一旦我们调用 equals 和 hashCode,默认的实现是什么?对象类?他们是什么?默认等式将如何工作?默认的 hashCode 如何工作,返回什么?= = 只是检查它们是否引用了同一个对象,所以很简单,但是 equals ()和 hashCode ()方法怎么样呢?

79221 次浏览

IBM 的 Developerworks表示:

在这个默认实现下,有两个 references are equal only if they 引用完全相同的对象。 类似地,默认实现 of hashCode() provided by Object is 通过映射内存地址派生 将对象的值设置为整数值。

然而,为了确定特定供应商的 Java 版本的确切实现细节,最好看看源代码(如果可用的话)

是的,从 Object类,因为您的类隐式扩展 Object。equals只返回 this == objhashCode实现是本机的。只是猜测-它返回指向对象的指针。

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

根据文件:

equals

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

hashCode

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

来自其中一个 JVM 实现的 Object:

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


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

In both cases it's just comparing the memory addresses of the objects in question.

对象中有 equals()hashCode()的默认实现。如果您不提供自己的实现,那么将使用这些实现。对于 equals(),这意味着一个 ==比较: 对象只有在完全相同的情况下才相等。对于 hashCode()贾瓦多克有一个很好的解释。

有关详情,请参阅有效 Java,第三章(pdf) ,第8项。

如果不提供自己的实现,则将使用从 Object 派生的实现。这是可以的,除非您计划将类实例放入例如 HashSet (任何实际使用 hashCode ()的集合) ,或者需要检查对象相等性的东西(例如 HashSet 的包含()方法)。否则它将不正确地工作,如果这是你所要求的。

由于 Apache Commons Lang中的 HashCodeBuilder平等建造者,提供您自己的这些方法的实现非常容易。