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

2022-09-03 17:34:26

根据这篇文章的评论,可以或值。这是特定于实现的。但是在同一实现中,为什么会返回不同的值。例如:hascodenull objectsthrow NPEzeroObjects.hashcodehascode(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)

如果是这种情况,这是否会影响允许的位置。(它可能是要么要么key look-upHashMapnull Key-value pairshashbucket 0throw a NPE)


答案 1

你会如何计算一个甚至不存在的对象?当 is 时,调用它上面的任何方法都会抛出一个 。这并没有给你哈希码的任何特定值。hashCodep2nullNPE

Objects.hashCode()只是一个包装器方法,它对值执行预检查,对于不是 的引用,它返回与本例中相同的值。以下是该方法的源代码:nullnullp2.hashCode()

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

答案 2

如果你四处搜索,你会注意到它对键有一个特殊的处理方式。 值很好,因为您不会在 .这就是键在 中正常工作的原因。至于为什么工作正常,看看Rohit的答案。HashMapnullnullHashMapnullHashMapObjects.hashCode