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

时间:2016-04-22 05:19:02

标签: java hashset treeset

为什么在TypeError: unsupported operand type(s) for -: 'Date' and 'int'中添加null不会抛出HashSet,但在Exception中添加null会抛出异常。

TreeSet

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

NullPointerException

允许添加Set<String> s = new HashSet<String>(); 值。

2 个答案:

答案 0 :(得分:5)

因为TreeSet的底层数据结构是Red-Black tree,它是一个二叉搜索树,因此被排序。要对其进行排序,必须有一个比较器来确定值是等于,低于还是大于另一个值。默认的Comparator不是空安全的,如果您编写自己的支持null的Comparator,那么将null用作键是没有问题的。

答案 1 :(得分:0)

简单地说,这就是它的实施方式。根据{{​​3}}的Java规范,

  

此类允许null元素

根据HashSet方法中TreeSet的javadoc,它会抛出:

  

NullPointerException - 如果指定的元素为null并且此set使用自然排序,或者其比较器不允许null元素