AsSet (...)是否存在于任何 API 中?

我正在寻找一个非常简单的方式来创建一个集。

Arrays.asList("a", "b" ...)创建一个 List<String>

Set有类似的东西吗?

63196 次浏览

你可以用

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

不,但你可以这样做

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

使用 番石榴,就是这么简单:

Set<String> mySet = ImmutableSet.<String> of("a", "b");

或者对于可变集:

Set<String> mySet = Sets.newHashSet("a", "b")

有关更多数据类型,请参见 番石榴用户指南

番石榴中你可以使用

Set<String> set = Sets.newHashSet("a","b","c");

NewHashSet

正如其他人所说,使用:

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

在 Java 中存在 没有的原因是 Arrays.asList返回一个固定大小的列表,换句话说:

public static void main(String a[])
{
List<String> myList = Arrays.asList("a", "b");
myList.add("c");
}

返回:

Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(Unknown Source)
at java.util.AbstractList.add(Unknown Source)

Arrays类中没有“固定大小”Set的 JDK 实现。你为什么想要这个?Set保证没有副本,但是如果您手工输入它们,就不需要这个功能... ... 而且 List有更多的方法。两个接口都扩展了 CollectionIterable


正如其他人所说,如果您真的想要这个功能,那么使用 番石榴——因为它不在 JDK 中。看看他们的答案(特别是迈克尔 · 施梅瑟的答案) ,了解相关信息。

对于具有零个或一个成员的集合的特殊情况,您可以使用:

java.util.Collections.EMPTY_SET

以及:

java.util.Collections.singleton("A")

现在有了 Java8,你就不需要第三方框架了:

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

参见 收藏家

好好享受吧!

这里有一个你可以使用的小方法

  /**
* Utility method analogous to {@link java.util.Arrays#asList(Object[])}
*
* @param ts
* @param <T>
* @return the set of all the parameters given.
*/
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> Set<T> asSet(T... ts) {
return new HashSet<>(Arrays.asList(ts));
}

在 Java9中,通过工厂方法添加了类似的函数:

Set<String> oneLinerSet = Set.of("a", "b", ...);

(List也有等价物。)

使用 Java8和枚举的另一种方法是:

Set<String> set = EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.READ);

参见 EnumSet

我建议在此方法和

Set<String> set = Stream.of(StandardOpenOption.CREATE, StandardOpenOption.READ).collect(Collectors.toSet());

因为如果您有五个以上的元素,那么这个方法的 javadoc 会表明可能存在性能问题,正如您在 (E,E...)的 javadoc 中看到的那样。