如何获取覆盖hashCode()方法的对象的唯一标识符?

281

当一个Java类没有重写hashCode()方法时,打印这个类的实例会得到一个不错而且独特的数字。

Object类的Javadoc对hashCode()进行了说明:

尽量合理地说,由Object类定义的hashCode方法返回的是不同对象的不同整数。

但是当该类重写hashCode()方法后,如何获取它的唯一编号?


43
主要是为了“调试”原因;) 能够说:“啊,同一个对象!” - ivan_ivanovich_ivanoff
7
为此,System.identityHashcode() 可能会有一定的用处。但是,我不会依靠它来实现代码功能。如果您想唯一地识别对象,可以使用AspectJ,并在每个创建的对象中编织一个唯一的ID。虽然需要更多工作。 - Brian Agnew
9
请记住,hashCode不保证唯一。即使实现使用内存地址作为默认的hashCode。为什么它不是唯一的?因为对象被垃圾收集并重用内存。 - Igor Krivokon
8
如果你想确定两个对象是否相同,请使用“==”而不是“hashCode()”。即使在原始实现中,“hashCode()”也无法保证唯一性。 - Mnementh
13
没有一个答案回答了真正的问题,因为它们陷入了讨论 hashCode(),这在这里是次要的。如果我在 Eclipse 中查看引用变量,它会显示一个独特的不可变的“id=xxx”。我们如何通过编程方式获得该值,而不必使用自己的 id 生成器?我想访问那个值以进行调试(记录日志),以识别对象的不同实例。有人知道如何获得那个值吗? - Chris Westin
显示剩余6条评论
11个回答

0

hashCode()和identityHashCode()返回值之间存在差异。对于两个不相等的对象o1和o2(使用==测试),它们的hashCode()可能相同。请参见下面的示例,了解这是如何发生的。

class SeeDifferences
{
    public static void main(String[] args)
    {
        String s1 = "stackoverflow";
        String s2 = new String("stackoverflow");
        String s3 = "stackoverflow";
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());
        System.out.println(s3.hashCode());
        System.out.println(System.identityHashCode(s1));
        System.out.println(System.identityHashCode(s2));
        System.out.println(System.identityHashCode(s3));
        if (s1 == s2)
        {
            System.out.println("s1 and s2 equal");
        } 
        else
        {
            System.out.println("s1 and s2 not equal");
        }
        if (s1 == s3)
        {
            System.out.println("s1 and s3 equal");
        }
        else
        {
            System.out.println("s1 and s3 not equal");
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接