131

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

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

有什么类似的Set吗?

4

10 回答 10

110

现在使用 Java 8,您可以在不需要第三方框架的情况下做到这一点:

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

请参阅收集器

享受!

于 2016-12-23T16:46:33.860 回答
68

使用Guava,就这么简单:

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

或者对于一个可变集合:

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

有关更多数据类型,请参阅Guava 用户指南

于 2013-05-03T12:24:55.830 回答
58

你可以使用

new HashSet<String>(Arrays.asList("a","b"));
于 2013-05-03T12:21:31.257 回答
26

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

java.util.Collections.EMPTY_SET

和:

java.util.Collections.singleton("A")
于 2015-01-15T16:20:42.130 回答
22

在 Java 9 中,通过工厂方法添加了类似的功能:

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

(也有等价物List。)

于 2017-12-29T16:00:24.767 回答
21

正如其他人所说,使用:

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)

Set类中没有“固定大小”的 JDK 实现Arrays。你为什么要这个?ASet保证没有重复项,但是如果您手动输入它们,则不需要该功能......并且List有更多方法。两个接口都扩展CollectionIterable.


正如其他人所说,如果你真的想要这个功能,请使用guava - 因为它不在 JDK 中。查看他们的答案(特别是 Michael Schmeißer 的答案)以获取相关信息。

于 2013-05-03T12:28:30.577 回答
5

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

  /**
   * 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));
  }
于 2017-10-03T10:38:39.207 回答
4

不,但你可以这样做

new HashSet<String>(Arrays.asList("a", "b", ...));
于 2013-05-03T12:22:16.017 回答
3

番石榴中你可以使用

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

新哈希集

于 2013-05-03T12:27:21.287 回答
1

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

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

请参阅EnumSet

我建议在这种方法和

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

因为如果您有五个以上的元素,则该方法的 javadoc 说明可能是性能问题,正如您在Set.Of(E, E...)的 javadoc 中看到的那样。

于 2018-06-21T16:20:32.890 回答