为什么在 HashSet 中添加 null 不会抛出异常,但在 TreeSet 中添加 null 会抛出异常?

6
为什么在HashSet中添加null不会抛出异常,但在TreeSet中添加null会抛出异常?
Set<String>  s = new TreeSet<String>();
        s.add(null);

抛出 NullPointerException 异常

Set<String>  s = new HashSet<String>();

允许添加null值。

2个回答

13

TreeSet的底层数据结构是红黑树,它是二叉搜索树,因此是有序的。为了使其有序,必须有一个比较器来确定一个值是否等于、小于或大于另一个值。默认比较器不支持空值,但如果编写自己的比较器并支持空值,那么使用空值作为键就没有问题。


1

简单来说,就是这样实现的。根据 HashSet 的 Java 规范,

此类允许 null 元素。

而根据 TreeSetadd 方法的 javadoc,如果指定的元素为 null 并且该集合使用自然排序或其比较器不允许 null 元素,则会抛出 NullPointerException 异常:

NullPointerException - 如果指定的元素为 null 并且该集合使用自然排序或其比较器不允许 null 元素


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接