方法的用例,System.identityHashCode(Object x)

时间:2015-06-30 07:17:25

标签: java

我读了这个JAVA API方法的javadoc,System.identityHashCode(Object x)并且无法理解这种方法的典型用例。建议需要hashCode()的类具有自己的hashCode()方法,如果Object类已经默认为hashCode(),那么此方法的目的是什么?

3 个答案:

答案 0 :(得分:6)

假设C类扩展了B类,而B类覆盖了hashCodeequals

现在假设对于C类,您希望使用hashCode类中实现的equalsObject的默认实现。通常您不希望这样做,但假设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方法即使你覆盖它也会返回

这个答案对你有帮助吗?