Collection实现阻止添加的null元素

时间:2014-01-06 19:10:08

标签: java

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");
    }

  }

4 个答案:

答案 0 :(得分:2)

TreeSet适合您的要求。它的add(Object)方法javadoc状态

  

抛出:

     

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

Java 6Java 7

此外,如果您正在寻找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作为初始元素