Java Can';我不能在分类数据集中输入空值吗?

Java Can';我不能在分类数据集中输入空值吗?,java,collections,treeset,sortedset,Java,Collections,Treeset,Sortedset,我认为Set允许null 那么,为什么要使用以下代码: SortedSet<Integer> set = new TreeSet<Integer>(); set.add(null); set.add(1); //--->Line indicated by exception SortedSet set=new TreeSet(); set.add(空); set.add(1);//-->用异常表示的行 是否给出以下异常 线程“main”java.l

我认为
Set
允许
null

那么,为什么要使用以下代码:

SortedSet<Integer> set = new TreeSet<Integer>();  
set.add(null);  
set.add(1);  //--->Line indicated by exception  
SortedSet set=new TreeSet();
set.add(空);
set.add(1);//-->用异常表示的行
是否给出以下异常

线程“main”java.lang.NullPointerException中的异常位于
java.lang.Integer.compareTo(未知源)位于
java.lang.Integer.compareTo(未知源)位于
java.util.TreeMap.put(未知源代码)位于
java.util.TreeSet.add(未知源)


是的,你可以。但是,当将
null
与集合中的任何其他内容进行比较时,您必须提供自己的解决方案。应用自然排序后,Java对象不知道如何将自己与
null
进行比较。相反,
null
不知道如何将自身与任何对象进行比较,因为您无法调用
null.compareTo(object)

这种“空安全”比较器的示例实现可以在apache库中找到。看看这本书。您可以这样使用它:

// Unfortunately no support for Java generics yet, in commons-collections
@SuppressWarnings("unchecked")
SortedSet<Integer> set = new TreeSet<Integer>(new NullComparator());  
set.add(null);  
set.add(1);
//不幸的是,在commons集合中还不支持Java泛型
@抑制警告(“未选中”)
SortedSet集合=新树集合(新的NullComparator());
set.add(空);
增加(1);
TreeSet()的API说add将抛出一个NPE:

如果指定的元素为null,并且此集合使用自然排序, 或者它的比较器不允许空元素


因此,如果你想存储空值,你必须提供一个比较器来处理这个问题,它知道空值与0或所有其他值相比的位置。

你可以创建自己的“空”值,而不是创建一个比较器


不能将空值插入树集。从JDK1.7开始,树集合中不接受null。在TreeSet中插入null值将引发NullPointerException,因为在插入null时,它会与现有元素进行比较,而null不能与任何值进行比较。在JDK1.6之前,第一个元素插入可以为null,但任何更多的null元素都将导致NullPointerException


如果必须添加null,那么必须编写自己的自定义比较器来处理null,或者使用commons集合提供的NullComparator()

鉴于所有整数值都有其含义,这可能是一种不可接受的方法。如果使用的数字限制在特定范围内,则此方法可能是可接受的。最小值最不可能有用,因为它具有奇怪的属性,如
x==-x&&x!=0
;)通常不需要每个
int
值,但它使用的是
Long
可以作为一个选项。Long.MIN_值和Character.MIN_值(即0;)也是一样,但不是Short.MIN_值、Byte.MIN_值、Float.MIN_值或Double.MIN_值。这让我很惊讶。@LukasEder欢呼,我将以此作为补充。:)@卢卡斯·埃德尔,我们也能为特雷马克做同样的事情吗?在Java7中,TreeMap和TreeSet都被更改了()。@aashutoshrivastava:我认为最好用一个新的堆栈溢出问题来回答这个问题。请随意创建一个。谢谢@Lukas Eder。我使用的NullComparator()与您上面提到的相同&它工作正常。TreeMaptree1=newtreemap(newnullcomparator());树1.put(空,“aashu”);
static final Integer NULL = Integer.MIN_VALUE;

set.add(NULL):