最佳答案
根据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));
更多信息:
Object#hashCode()
and System#identityHashCode()
work at the back end?