HashSet Set实现允许添加null。是否有任何不允许null的Collection实现?我知道我可以删除HashSet上的null,但我想知道我是否可以限制它。
public static void main(String[] args) {
Set<String> testing = new HashSet<String>();
testing.add(null);
testing.add("test");
for(String str : testing){
}
}
//TreeSet allows null as well
public static void main(String[] args) {
TreeSet<String> testing = new TreeSet<String>();
testing.add(null);
for(String str : testing){
System.out.println("testing");
}
}
答案 0 :(得分:2)
TreeSet
适合您的要求。它的add(Object)
方法javadoc状态
抛出:
NullPointerException - 如果指定的元素为null且此设置 使用自然排序,或其比较器不允许空元素
此外,如果您正在寻找Collection
实施(而不是Set
工具),则有others。
答案 1 :(得分:0)
如果你想使用HashSet,但是对no null有限制,你也可以创建一个扩展HashSet的类。
示例:强>
public class HashSetNullLess<E> extends HashSet<E> {
public boolean add(E e) {
if(e==null)
return false; //Or throw unsupported exception message
return super.add(e);
}
}
当我检查HashSet.java的代码时,这应该会解决这个问题,甚至接受集合的构造函数也会通过add
中的addAll
导致AbstractCollection.java
方法
请参阅:
public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
for (E e : c)
if (add(e))
modified = true;
return modified;
}
答案 2 :(得分:0)
我同意SotiriosDelimanolis。我试图在JDK 7中运行此代码。
public class Test {
public static void main(String arg[]) {
TreeSet<String> set = new TreeSet<String>();
set.add(null);
set.add("Test");
System.out.println(set);
}
}
但是出现了以下错误:
线程“main”中的异常java.lang.NullPointerException
我认为使用您的要求将会实现。
答案 3 :(得分:-1)
考虑包装Hashtable类。它不允许 nulls ,但是它实现了 Map 接口。您可以通过HasSet包装HashMap的方式执行此操作。考虑到Hashtable是同步的。
使用next,但它是一个非常隐含的,可能会使代码阅读更难
HashSet<String> set = new HashSet<String>() {
@Override
public boolean add(String s) {
if(s == null)
throw new NullPointerException();
return super.add(s);
}
};
使用TreeMap,但在实际使用之前只添加一个元素,因为它仅接受null作为初始元素