我读了这个JAVA API方法的javadoc,System.identityHashCode(Object x)
并且无法理解这种方法的典型用例。建议需要hashCode()
的类具有自己的hashCode()
方法,如果Object类已经默认为hashCode()
,那么此方法的目的是什么?
答案 0 :(得分:6)
假设C类扩展了B类,而B类覆盖了hashCode
和equals
。
现在假设对于C类,您希望使用hashCode
类中实现的equals
和Object
的默认实现。通常您不希望这样做,但假设C
类的每个实例都应该是某些HashMap
中的唯一键。
你可以写:
public class C extends B
{
@Override
public int hashCode ()
{
return System.identityHashCode(this);
}
@Override
public boolean equals (Object other)
{
return this == other;
}
}
类似地,如果B覆盖了toString
并且您希望C的toString具有Object类的默认实现,则可以用C编写:
@Override
public String toString()
{
return getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(this));
}
答案 1 :(得分:1)
没有很多用例。如果由于某种原因你有一组对象,并且只关心它们的对象身份,它主要是有用的。这真的很少见。一个例子是IdentityHashMap(就像@Boris所说)。实际上可以使用hashCode
对象来处理这种哈希映射,但是理论上使用身份哈希会更快,因为它可以避免"冲突"在逻辑上equal
但不是同一个对象的对象之间(我猜也避免了错误实现的哈希函数)。
此类集合也没有很多用例。您可以在此处查看IdentityHashMap的用例:Practical use of IdentityHashMap in Java 6
答案 2 :(得分:-1)
只有一个区别,如果给定的对象是 null ,则此方法提供 0 。
示例1:
obj.hasCode();
如果obj为null,则此代码抛出nullPointerException。
示例2:
System.identityHashCode(OBJ);
此方法返回0并且不会抛出异常,因为它会检查null。它还为HashCode提供了默认的hashCode方法即使你覆盖它也会返回
这个答案对你有帮助吗?