我知道所有那些奇怪的哲学原因为什么每个集合中都允许 null 实例
但与列表不同,集合的位置(甚至地图也是如此)元素依赖于元素本身添加的元素的哈希码(除了LinkedHashSet
之类的例外,其中插入订单保留)
因此,当计算元素的哈希码被添加到集合中并且如果该元素被假定为 null 时,它不应该抛出 NPE 吗?
null.hashCode()
是否有某种类型的空检查
首先我想 如果有 null , System.out.println(setReference)也应该生成 NPE ,但经过相当多的研究后我发现了实际的方法被称为静态 valueOf(Object obj)而不是 toString()方法 这与java docs中陈述的内容无关, 我终于清楚了解它......
但是这仍然困扰着我,我知道我对微小的细节并不感到迷恋,但我必须'因为目前我正在为OCAJP 8做准备所以我冒着降低风险来获得可信的解释,因为我在java docs中找不到任何东西与此有关...
所以集合中的哪些操作是安全无效的,我们非常感谢。
答案 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);
}
因此,长话短说,HashSet
和HashMap
显式处理null
并将其哈希值视为0。