所以我最近使用地图做了一些编码,我偶然发现了NullPointerException
:
Map<Integer, Integer> map = new TreeMap<>();
map.put(1,1);
map.containsKey(null);
这引起了标准NullPointerException
。
然而,因为这是一个参与,我知道其他人没有得到这个例外,因为有些东西变得怪异,所以我测试了这个:
Map<Integer, Integer> map = new HashMap<>();
map.put(1,1);
map.containsKey(null);
这并没有抛出异常。
基本上我想知道为什么会发生这种行为,因为hashmap
和treemap
之间的最佳行为应该与执行某些功能的时间相同。
答案 0 :(得分:2)
在Map.containsKey(Object key)
中,您可以找到异常的说明:
NullPointerException - 如果指定的键为null且此映射不允许空键(可选)
所以由实现来决定是否抛出它(抛出术语定义声明中的抛出)
您在HashMap.containsKey(Object key)
中看到它未按您的代码预期定义。
答案 1 :(得分:1)
详细阐述AxelH的Murat答案:让我们来看看源代码
<强> TreeMap的强>
public V get(Object key) {
Entry<K,V> p = getEntry(key);
return (p==null ? null : p.value);
}
final Entry<K,V> getEntry(Object key) {
// Offload comparator-based version for sake of performance
if (comparator != null)
return getEntryUsingComparator(key);
if (key == null)
throw new NullPointerException();
...
}
如您所见,如果NPE
key == null
<强> HashMap中强>
transient Entry[] table;
public V get(Object key) {
if (key == null)
return getForNullKey();
...
}
private V getForNullKey() {
for (Entry<K,V> e = table[0]; e != null; e = e.next) {
if (e.key == null)
return e.value;
}
return null;
}
至于HashMap
,get()
会检查Entry
是否包含密钥null
,并返回Entry
的值。< / p>
答案 2 :(得分:0)