对TreeMap上的ContainsKey的NullPointerException与HashMap上没有异常

时间:2017-02-16 14:48:03

标签: java

所以我最近使用地图做了一些编码,我偶然发现了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);

这并没有抛出异常。

基本上我想知道为什么会发生这种行为,因为hashmaptreemap之间的最佳行为应该与执行某些功能的时间相同。

3 个答案:

答案 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;
}

至于HashMapget()会检查Entry是否包含密钥null,并返回Entry的值。< / p>

答案 2 :(得分:0)

因为实施方式不同。

TreeMap抛出:See here

  • ClassCastException - 如果指定的键无法与之比较 当前在地图中的键
  • NullPointerException - 如果指定的键 为null,此映射使用自然排序,或其比较器 不允许空键

HashMap不会抛出并返回布尔值。 See here