【发布时间】:2013-04-27 20:24:27
【问题描述】:
我正在寻找一种非常简单的方法来创建 Set。
Arrays.asList("a", "b" ...) 创建一个List<String>
Set 有什么类似的吗?
【问题讨论】:
-
不是的,创建一个Set和把一个Array转成一个Set不是一回事
标签: java collections
我正在寻找一种非常简单的方法来创建 Set。
Arrays.asList("a", "b" ...) 创建一个List<String>
Set 有什么类似的吗?
【问题讨论】:
标签: java collections
现在使用 Java 8,您无需第三方框架即可做到这一点:
Set<String> set = Stream.of("a","b","c").collect(Collectors.toSet());
享受吧!
【讨论】:
使用Guava,就这么简单:
Set<String> mySet = ImmutableSet.<String> of("a", "b");
或者对于可变集合:
Set<String> mySet = Sets.newHashSet("a", "b")
更多数据类型见Guava user guide
【讨论】:
Sets.newHashSet("a", "b") 或 Sets.newLinkedHashSet("a", "b")
Sets.newLinkedHashSet() 不存在该签名,抱歉
Set<String> mySet = ImmutableSet.of("a", "b");
你可以使用
new HashSet<String>(Arrays.asList("a","b"));
【讨论】:
对于具有零个或一个成员的集合的特殊情况,您可以使用:
java.util.Collections.EMPTY_SET
和:
java.util.Collections.singleton("A")
【讨论】:
java.util.Collections.emptySet() 比 EMPTY_SET 更受欢迎。来自 Collections 类中的 cmets:Unlike the like-named field, this method is parameterized.
在 Java 9 中,通过工厂方法添加了类似的功能:
Set<String> oneLinerSet = Set.of("a", "b", ...);
(List 也有等价物。)
【讨论】:
正如其他人所说,使用:
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 有更多方法。两个接口都扩展了Collection 和Iterable。
正如其他人所说,如果你真的想要这个功能,请使用guava - 因为它不在 JDK 中。查看他们的答案(尤其是 Michael Schmeißer 的答案)以获取相关信息。
【讨论】:
这是一个你可以使用的小方法
/**
* 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));
}
【讨论】:
不,但你可以这样做
new HashSet<String>(Arrays.asList("a", "b", ...));
【讨论】:
【讨论】:
使用 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 中看到的那样。
【讨论】: