假设我有自己的课
public class MyObj { /* ... */ }
它有一些属性和方法。
一旦我们调用 equals 和 hashCode,默认的实现是什么?对象类?他们是什么?默认等式将如何工作?默认的 hashCode 如何工作,返回什么?= = 只是检查它们是否引用了同一个对象,所以很简单,但是 equals ()和 hashCode ()方法怎么样呢?
IBM 的 Developerworks表示:
在这个默认实现下,有两个 references are equal only if they 引用完全相同的对象。 类似地,默认实现 of hashCode() provided by Object is 通过映射内存地址派生 将对象的值设置为整数值。
然而,为了确定特定供应商的 Java 版本的确切实现细节,最好看看源代码(如果可用的话)
是的,从 Object类,因为您的类隐式扩展 Object。equals只返回 this == obj。hashCode实现是本机的。只是猜测-它返回指向对象的指针。
Object
equals
this == obj
hashCode
是的,默认实现是 Object 的(一般来说,如果从重新定义了 equals 和/或 hashCode 的类继承,那么将使用该实现)。
根据文件:
Object 类的 equals 方法在对象上实现了最有区别的等价关系,也就是说,对于任何非空的参考值 x 和 y,这个方法返回 当且仅当 x 和 y 引用同一个对象时为 true (x = = y 的值为 true)。
由 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(),贾瓦多克有一个很好的解释。
equals()
hashCode()
==
有关详情,请参阅有效 Java,第三章(pdf) ,第8项。
如果不提供自己的实现,则将使用从 Object 派生的实现。这是可以的,除非您计划将类实例放入例如 HashSet (任何实际使用 hashCode ()的集合) ,或者需要检查对象相等性的东西(例如 HashSet 的包含()方法)。否则它将不正确地工作,如果这是你所要求的。
由于 Apache Commons Lang中的 HashCodeBuilder和 平等建造者,提供您自己的这些方法的实现非常容易。