默认的.equals和.hashCode如何为我的类工作?

说我有我自己的class级

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

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

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

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

从文档:

equals

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

hashCode

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

从其中一个JVM实现中的Object

 public boolean equals(Object object) { return this == object; } public int hashCode() { return VMMemoryManager.getIdentityHashCode(this); } 

在这两种情况下,只是比较有问题的对象的内存地址。

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

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

是的,从Object类,因为你的类隐式扩展Object。 equals简单地返回this == objhashCode实现是本地的。 只是一个猜测 – 它返回指向对象的指针。

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

通过Apache Commons Lang的 HashCodeBuilder和EqualsBuilder提供您自己的这些方法的实现是很容易的。

IBM的developerworks说:

在这个默认实现下,两个引用只有在引用完全相同的对象时才是相等的。 类似地,由Object提供的hashCode()的默认实现是通过将对象的内存地址映射到整数值来派生的。

但是,要确定特定供应商的Java版本的确切实现细节,最好将其视为源(如果可用)