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

ale*_*pro 103 java equality equals object hashcode

说我有自己的课

public class MyObj { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

它有一些属性和方法.它不实现equals,不实现hashCode.

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

Eti*_*tel 91

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

从文档:

equals

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

hashCode

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

  • 请注意,与“hashCode”的文档相反,HotSpot [默认返回一个随机数](/sf/ask/156640431/ -not-overridden/32454673#32454673) 作为哈希值。另请参阅[此博客条目](https://srvaroa.github.io/jvm/java/openjdk/biased-locking/2017/01/30/hashCode.html)。 (2认同)

Bra*_*ace 46

来自Object其中一个JVM实现:

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

public int hashCode() {
    return VMMemoryManager.getIdentityHashCode(this);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 它来自哪个版本的JDK?在`v6u23 ea`中:`public native int hashCode();` (7认同)

Jor*_*orn 10

还有的默认实现equals(),并hashCode()在对象.如果您不提供自己的实现,将使用这些实现.对于equals(),这意味着==比较:如果对象完全是同一个对象,则它们将是相等的.因为hashCode(),Javadoc有一个很好的解释.

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