为啥 TreeMap 中不允许空键?

Posted

技术标签:

【中文标题】为啥 TreeMap 中不允许空键?【英文标题】:Why null key is not allowed in TreeMap?为什么 TreeMap 中不允许空键? 【发布时间】:2018-07-19 03:52:16 【问题描述】:

我试图理解 Java Collection 框架背后的概念,并提出了这个问题 - 为什么在 TreeMap 中不允许使用空键?

如果我们尝试在 TreeMap 中添加 null 键,它会给出 NullPointerException。

尝试用谷歌搜索 TreeMap 的内部工作,发现类似 TreeMap 使用 RedBlack 树算法,这对我来说现在很难理解,我正在研究它。

TreeMap 是一个基于红黑树的 NavigableMap 实现。在其他 words ,它使用红黑树对 TreeMap 对象键进行排序 算法。

请清楚我,虽然 Map 接口的其他两个实现允许 null 作为键,但为什么 TreeMap 不允许添加 null 作为键?

我要提前感谢您的解释。

【问题讨论】:

如何对null 值进行排序? 相关 - Make treemap tolerate null 【参考方案1】:

我的印象是 Treemap 不允许任何空键,但是在使用 java 6 时,我发现我可以在树形图中使用 null 键添加第一个元素,但是使用 java 8 它是不是这样的。

 Map<String, Date> productStartDatesBySourceProductID = new TreeMap<String, Date>();

【讨论】:

【参考方案2】:

TreeMap 确实允许空键。默认的自然排序比较器是引发异常的比较器。

来自TreeMap.put的documentation:

NullPointerException - 如果指定键为空且此映射使用自然排序,或者其比较器不允许空键

允许空值的最简单方法是使用Comparator.nullsFirst(Comparator.naturalOrder())Comparator.nullsLast(Comparator.naturalOrder()) 之类的比较器创建TreeMap

【讨论】:

所以,我们只需要让 Comparator 接受 null 并排序 null 键。

以上是关于为啥 TreeMap 中不允许空键?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Hashtable 不允许空键或空值?

TreeMap理解

TreeMap和Comparable接口

TreeSet和TreeMap

HashMap,LinkedHashMap,TreeMap的区别

HashMap,LinkedHashMap,TreeMap的区别(转)