为什么在HashSet中加null不抛异常,在TreeSet中加null却抛异常

Why adding null in HashSet does not throw Exception,but adding null in TreeSet throw Exception

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

Set<String>  s = new TreeSet<String>();
        s.add(null);

抛出 NullPointerException

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

允许添加 Null 值。

简而言之,这就是它的实现方式。根据 HashSet

的 Java 规范

This class permits the null element

根据 TreeSet in the add 方法的 javadoc,它抛出:

NullPointerException - if the specified element is null and this set uses natural ordering, or its comparator does not permit null elements

因为TreeSet的底层数据结构是一个Red-Black tree,是一个二叉查找树,所以是排序的。要对其进行排序,必须有一个比较器来确定一个值是否等于、小于或大于另一个值。默认的 Comparator 不是 null 安全的,但是如果您编写自己的支持 null 的 Comparator,那么使用 null 作为键是没有问题的。