Object 的 .equals 和 .hashCode 将如何适用于我的类?

问题描述 投票:0回答:6

说我有自己的班级

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

它有一些属性和方法。它没有实现 equals,也没有实现 hashCode。

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

java object equals hashcode equality
6个回答
118
投票

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

来自文档:

equals

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

hashCode

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


62
投票

来自 JVM 实现之一中的

Object

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

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

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


12
投票

Object 中有

equals()
hashCode()
的默认实现。如果您不提供自己的实现,那么将使用它们。对于
equals()
,这意味着
==
比较:只有当对象完全相同时,它们才相等。对于
hashCode()
Javadoc 有很好的解释。

有关更多信息,请参阅《Effective Java》,第 3 章 (pdf),第 8 项。


1
投票

是的,来自

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


1
投票

如果您不提供自己的实现,则将使用从 Object 派生的实现。没关系,除非您计划将类实例放入 HashSet (任何实际使用 hashCode() 的集合),或需要检查对象相等性的东西(即 HashSet 的 contains() 方法)。否则,如果这就是您所要求的,它将无法正常工作。

借助来自 Apache Commons LangHashCodeBuilderEqualsBuilder,可以很容易地提供自己的这些方法的实现。


0
投票

IBM 的 developerworks 说:

在此默认实现下,两个 仅当引用相等时 指的是完全相同的对象。 同样,默认实现 Object 提供的 hashCode() 是 通过映射内存地址得出 对象的整数值。

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

© www.soinside.com 2019 - 2024. All rights reserved.