在计算哈希码

时间:2016-07-19 08:13:46

标签: java collections nullpointerexception set

我知道所有那些奇怪的哲学原因为什么每个集合中都允许 null 实例

但与列表不同,集合的位置(甚至地图也是如此)元素依赖于元素本身添加的元素的哈希码(除了LinkedHashSet之类的例外,其中插入订单保留)

因此,当计算元素的哈希码被添加到集合中并且如果该元素被假定为 null 时,它不应该抛出 NPE 吗?

  

null.hashCode()

是否有某种类型的空检查

首先我想 如果有 null System.out.println(setReference)也应该生成 NPE ,但经过相当多的研究后我发现了实际的方法被称为静态 valueOf(Object obj)而不是 toString()方法 这与java docs中陈述的内容无关, 我终于清楚了解它......

但是这仍然困扰着我,我知道我对微小的细节并不感到迷恋,但我必须'因为目前我正在为OCAJP 8做准备所以我冒着降低风险来获得可信的解释,因为我在java docs中找不到任何东西与此有关...

所以集合中的哪些操作是安全无效的,我们非常感谢。

1 个答案:

答案 0 :(得分:6)

明确处理

null。如果查看HashSet的实现,它基本上是HashMap,其中所有键都指向相同(虚拟)值。如果你深入到HashMap计算密钥哈希码的方式,你会发现这个方法(代码取自OpenJDK 1.8.0_92-b14,尽管我真诚地怀疑它会在任何其他JDK中有所不同):

static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

因此,长话短说,HashSetHashMap显式处理null并将其哈希值视为0。

相关问题