📅  最后修改于: 2023-12-03 15:35:58.352000             🧑  作者: Mango
TreeSet 是 Java 中一种基于红黑树实现的有序集合。相比于 HashSet,它能够按照元素的自然顺序进行排序,并支持更加丰富的查询操作。但是 TreeSet 中有一个限制,即它不允许存放 null 元素。为什么 TreeSet 不允许存放 null 呢?
一句话概括:存放 null 破坏了红黑树的特性。
具体来说,TreeSet 内部是通过红黑树来实现的。红黑树在插入节点时,需要通过比较新插入的节点和已有节点的大小来确定新节点的插入位置。而在比较两个节点大小时,如果其中一个节点为 null,就无从比较了,这就破坏了红黑树的特性。
以代码片段为例:
TreeSet<String> set = new TreeSet<>();
set.add("hello");
set.add(null); // NullPointerException
在上述代码中,当我们尝试将 null 插入到 TreeSet 中时,会抛出 NullPointerException 异常,这是因为 TreeSet 的实现中,比较元素的方法调用了传入元素的 compareTo 方法,而传入 null 时,其调用方法为 null.compareTo,因此会抛出异常。
如果确实需要在有序集合中存放 null 元素,可以考虑使用 Collections 中提供的一个方法:
TreeSet<String> set = new TreeSet<>(Comparator.nullsFirst(Comparator.naturalOrder()));
set.add(null);
set.add("hello");
在上述代码中,我们通过指定使用 nullsFirst 方法生成的比较器,将 null 视为最小值。这样就可以在 TreeSet 中存放 null 了。
在 TreeSet 中存放 null 破坏了红黑树的特性,导致无法比较和插入元素。如果需要在有序集合中存放 null,请使用比较器,将 null 视为最小值。