根据此post的评论,hascode
的{{1}}可以null objects
或throw NPE
的值。这是特定于实现的。但在同一实施中,为什么呢
zero
和Objects.hashcode
返回不同的值。例如:
hascode(instance)
输出:
public class EqualsTesting {
public static void main(String[] args){
String p1 =null;
String p2 = null;
System.out.println(Objects.hashCode(p1));
System.out.println(p2.hashCode());
}
}
如果是这种情况,这不会影响允许0
Exception in thread "main" java.lang.NullPointerException
at BinaryTrees.EqualsTesting.main(EqualsTesting.java:14)
的{{1}}中的key look-up
。 (可能是HashMap
到null Key-value pairs
或hash
)
答案 0 :(得分:13)
您如何计算甚至不存在的对象的hashCode
?当p2
为null
时,在其上调用任何方法都会抛出NPE
。这并没有给你任何特定的hashCode值。
Objects.hashCode()
只是一个包装器方法,它对null
值执行预检查,对于不是null
的引用,它返回与p2.hashCode()
相同的值在这种情况下。这是该方法的源代码:
public static int hashCode(Object o) {
return o != null ? o.hashCode() : 0;
}
答案 1 :(得分:5)
如果您要搜索,您会注意到HashMap
null
个null
个密钥。 HashMap
值很好,因为您不在null
中为它们计算哈希码。这就是HashMap
密钥在Objects.hashCode
中正常工作的原因。至于为什么{{1}}工作正常,请看看Rohit的回答。
答案 2 :(得分:2)
正如the javadoc所说:
Objects.hashCode(Object o)
返回非null参数的哈希码,0表示null 参数。
p2.hashCode()
会抛出NullPointerException
,因为您正在尝试访问null对象的方法。
答案 3 :(得分:2)
根据这篇文章的评论,空对象的hascode可以抛出NPE或零值。
事实并非如此。 (这不是@ Bohemian的评论所说的!)
HashMap
和HashSet
中发生的事情是他们将null
视为特例。它们不是在hashcode()
对象(NPE !!)上调用null
,而是使用零作为硬编码的替代哈希码。
我强调......这是HashMap
和HashSet
... hashcode()
的特例行为。
如您的示例所示,如果您执行尝试在hashcode()
上调用null
方法,则将获得NPE。 JLS说这就是将要发生的事情......每当你试图在null
上调用任何实例方法时就会发生这种情况。
(另一方面,Objects.hashCode(obj)
方法 处理obj
null
作为特例的情况。这就是重点静态方法!)
答案 4 :(得分:0)
null
的哈希码为 0(参见 Objects.hash()
)
public static int hashCode(Object a[]) {
if (a == null)
return 0;
int result = 1;
for (Object element : a)
result = 31 * result + (element == null ? 0 : element.hashCode());
return result;
}