什么必须是Java中的空对象的哈希码?

时间:2014-02-03 18:37:33

标签: java object hashmap hashcode

根据此post的评论,hascode的{​​{1}}可以null objectsthrow NPE的值。这是特定于实现的。但在同一实施中,为什么呢 zeroObjects.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。 (可能是HashMapnull Key-value pairshash

5 个答案:

答案 0 :(得分:13)

您如何计算甚至不存在的对象的hashCode?当p2null时,在其上调用任何方法都会抛出NPE。这并没有给你任何特定的hashCode值。

Objects.hashCode()只是一个包装器方法,它对null值执行预检查,对于不是null的引用,它返回与p2.hashCode()相同的值在这种情况下。这是该方法的源代码:

public static int hashCode(Object o) {
    return o != null ? o.hashCode() : 0;
}

答案 1 :(得分:5)

如果您要搜索,您会注意到HashMap nullnull个密钥。 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的评论所说的!)

HashMapHashSet中发生的事情是他们将null视为特例。它们不是在hashcode()对象(NPE !!)上调用null,而是使用零作为硬编码的替代哈希码。

我强调......这是HashMapHashSet ... 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;
    }