为什么Map的实现处理null的方式不同?



containsKey(Object key)为例:

  • TreeMap抛出NullPointerException,如果键为空。
  • TreeMap返回false如果没有对应键的映射。
  • HashMap不会抛出NullPointerException并且永远不会返回null。

让我们看一下TreeSet的Javadoc:

抛出NullPointerException—如果指定的键为空且该映射使用自然排序,或者其比较器不允许空键

意义:这两个Map实现确实具有不同的语义。因此,它们各自实现的"Map"方法的工作方式不同是有道理的。

TreeSet的一个关键属性是它支持/要求排序。这与null不能很好地发挥作用,因此当null进来时,它是"公平"的。

请阅读此处的文档:

一些映射实现对它们的键和值有限制可能包含。例如,一些实现禁止空键和值,有些对其键的类型有限制。尝试插入不符合条件的键或值将引发未检查异常,通常是NullPointerException或ClassCastException。试图查询是否存在不符合条件的键或值可能会抛出异常,或者简单地返回false;一些实现将显示前一种行为,有些将显示后者。

最新更新