为什么在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 作为键是没有问题的。
为什么在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 作为键是没有问题的。