默认的.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 == obj
。 hashCode
实现是本地的。 只是一个猜测 – 它返回指向对象的指针。
如果你不提供你自己的实现,将使用从Object派生的实现。 这是可以的,除非你打算把你的类实例放入HashSet(任何实际使用hashCode()的集合),或者需要检查对象的相等性(即HashSet的contains()方法)。 否则,它会工作不正确,如果这是你所要求的。
通过Apache Commons Lang的 HashCodeBuilder和EqualsBuilder提供您自己的这些方法的实现是很容易的。
IBM的developerworks说:
在这个默认实现下,两个引用只有在引用完全相同的对象时才是相等的。 类似地,由Object提供的hashCode()的默认实现是通过将对象的内存地址映射到整数值来派生的。
但是,要确定特定供应商的Java版本的确切实现细节,最好将其视为源(如果可用)