java - 在构造函数中如何初始化HashSet的值?

我需要创建一个有初始值的Set


Set<String> h = new HashSet<String>();
h.add("a");
h.add("b");

有没有一种方法可以在一个命令中执行这个操作?

时间:


Set<String> h = new HashSet<String>(Arrays.asList("a","b"));

此外,因为你正在构造数组,转换为列表并使用该列表创建集合,这时间效率并不高。

初始化static final集时,我通常会这样编写它:


public static final String[] SET_VALUES = new String[] {"a","b" };
public static final Set<String> MY_SET = new HashSet<String>(Arrays.asList(SET_VALUES));

你可以使用Guava的Sets


Sets.newHashSet("a","b","c")

或者你可以使用以下语法,这将创建一个匿名类,但是它很hacky :


Set<String> h = new HashSet<String>() {{
 add("a");
 add("b");
}};

有几种方法:

双大括号初始化

这是创建匿名内部类的技术,它有一个实例初始值设定项,在创建实例时,它将String的自身添加到自身:


Set<String> s = new HashSet<String>() {{
 add("a");
 add("b");
}}

记住,这实际上会在每次使用时创建一个HashSet新的子类,即使没有显式地编写新子类。

一种实用方法

编写返回一个用元素初始化的Set的方法并不难写:


public static Set<String> newHashSet(String... strings) {
 HashSet<String> set = new HashSet<String>();

 for (String s : strings) {
 set.add(s);
 }
 return set;
}

上面的代码仅允许使用String,但是使用泛型实现任何类型并不太难。

使用库

许多库都有一个方便的方法来初始化集合对象。

例如,Google Collections有一个Sets.newHashSet(T...)方法,它将用特定类型的元素填充HashSet 。

你可以在Java 6中完成:


Set<String> h = new HashSet<String>(Arrays.asList("a","b","c"));

在Java 8中,我会使用:


Set<String> set = Stream.of("a","b").collect(Collectors.toSet());

这为你提供了一个使用"a"和"b"的可变Set预初始化,如果你需要HashSet,请执行以下操作:


Set<String> set = Stream.of("a","b")
 .collect(Collectors.toCollection(HashSet::new));


public static <T> Set<T> newHashSet(T... objs) {
 Set<T> set = new HashSet<T>();
 for (T o : objs) {
 set.add(o);
 }
 return set;
}

有点令人费解,但可以在Java 5中使用:


Set<String> h = new HashSet<String>(Arrays.asList(new String[] { 
"a","b"
}))


Set<String> h = asSet ("a","b");

public Set<String> asSet(String... values) {
 return new HashSet<String>(java.util.Arrays.asList(values));
}

我觉得最容易使用的是google Guava:


Set<String> StringSet = Sets.newSet("a","b","c");

这是一个优雅的解决方案:


public static final <T> Set<T> makeSet(@SuppressWarnings("unchecked") T... o) {
 return new HashSet<T>() {
 private static final long serialVersionUID = -3634958843858172518L;
 {
 for (T x : o)
 add(x);
 }
 };
}

...