最佳答案

根据javadoc, System.identityHashCode(Object o) :



因此,首先,System.identityHashCode(nullReference)将始终为您提供0,而不是nullReference.hashCode(),这显然会在运行时为您提供NullPointerException

但是,让我们考虑以下类:

public class MysteriousOne {
    @Override
    public int hashCode() {
        return 0xAAAABBBB;
    }

    //override equals() and so on...
}

该类将覆盖hashCode(),这是很好的方法,即使每个实例的哈希码都相同,但是如果您要区分多个实例的身份,则不是很好。通常,您会尝试使用.toString()方法的输出(默认情况下会提供类名,然后是@,然后是hashCode()输出),例如,找出对象的真实身份,但在这种情况下,输出将是相同的:
MysteriousOne first = new MysteriousOne();
MysteriousOne second = new MysteriousOne();
System.out.println("First: " + first);
System.out.println("Second: " + second);

输出为:
First: MysteriousOne@aaaabbbb
Second: MysteriousOne@aaaabbbb

因此,使用hashCode()的这种实现不可能区分几个实例的身份。哪个是System.identityHashCode()方便的地方。

如果你这样做
System.out.println("First: " + System.identityHashCode(first));
System.out.println("Second: " + System.identityHashCode(second));

即使它们的类实现的hashCode()返回一个常量,您也会为不同的实例得到两个不同的数字(实际上,按照javadoc的要求,实际上根本不会调用hashCode()的重写实现):
First: 366712642
Second: 1829164700

此外,您甚至可以将基元传递给System.identityHashCode(Object o),因为它们将被装箱到其相应的包装器中:
int i = 5;
System.out.println(System.identityHashCode(i));

更多信息:
  • How do Object#hashCode() and System#identityHashCode() work at the back end?
  • 10-08 06:45
    查看更多