来自 JVM 实现之一中的 Object
:
public boolean equals(Object object) {
return this == object;
}
public int hashCode() {
return VMMemoryManager.getIdentityHashCode(this);
}
在这两种情况下,它只是比较相关对象的内存地址。
v6u23 ea
:public native int hashCode();
是的,来自 Object
类,因为您的类隐式扩展了 Object。 equals
只返回 this == obj
。 hashCode
实现是本机的。只是一个猜测 - 它返回指向对象的指针。
如果您不提供自己的实现,则将使用从 Object 派生的实现。没关系,除非您打算将您的类实例放入 HashSet(任何实际使用 hashCode() 的集合),或者需要检查对象相等性的东西(即 HashSet 的 contains() 方法)。否则,如果这是您所要求的,它将无法正常工作。
借助 Apache Commons Lang 中的 HashCodeBuilder 和 EqualsBuilder,您可以很容易地提供这些方法的实现。
Foo
和 Bar
是对可变类型的两个不同实例的引用,并且存在一个方法(例如 SomeMutatingMethod
)使得 Foo.SomeMutatingMethod()
不会像对 Foo
那样影响 Bar
,这种差异应该足以将对象视为不平等。
IBM 的 developerworks 说:
在此默认实现下,两个引用只有在引用完全相同的对象时才相等。类似地,Object 提供的 hashCode() 的默认实现是通过将对象的内存地址映射到一个整数值来派生的。
但是,要确定特定供应商的 Java 版本的确切实现细节,最好查看源代码(如果可用)
hashCode
的文档相反,HotSpot returns a random number per default 作为哈希。另见this blog entry。