1. 概述
在这个快速教程中,我们将介绍在构造HashSet时使用值初始化HashSet的各种方法。
要探索HashSet的功能,请参阅此处的这篇核心文章。
我们将深入探讨自Java 5及之前版本以来的Java内置方法,然后是自Java 8以来引入的新机制。
我们还将看到自定义实用程序方法,并最终探索第三方集合库(尤其是Google Guava)提供的功能。
如果我们已经迁移到JDK 9+,可以简单地使用集合工厂方法。
2. Java内置方法
让我们首先检查自Java 5或更早版本以来可用的三种内置机制。
2.1 使用另一个集合实例
我们可以传递另一个集合的现有实例来初始化Set。
这里我们使用内联创建的List:
Set<String> set = new HashSet<>(Arrays.asList("a", "b", "c"));
2.2 使用匿名类
在另一种方法中,我们可以使用匿名类向HashSet添加元素。
注意双花括号的使用。这种方法在技术上非常昂贵,因为它在每次调用时都会创建一个匿名类。
因此,根据我们需要初始化Set的频率,我们可以尽量避免使用这种方法:
Set<String> set = new HashSet<String>();
2.3 从Java 5开始使用CollectionsUtility方法
Java的Collections实用程序类提供名为singleton的方法来创建具有单个元素的Set。使用singleton方法创建的Set实例是不可变的,这意味着我们不能向它添加更多的值。
在某些情况下,尤其是在单元测试中,我们需要创建一个具有单个值的集合:
Set<String> set = Collections.singleton("a");
3. 定义自定义实用方法
我们可以定义一个静态的final方法,如下所示。该方法接收可变参数。
使用接收集合对象和值数组的Collections.addAll是最好的,因为复制值的开销很低。
该方法使用泛型,因此我们可以传递任何类型的值:
public static final <T> Set<T> newHashSet(T... objs) {
Set<T> set = new HashSet<T>();
Collections.addAll(set, objs);
return set;
}
以下是我们如何在代码中使用实用程序方法:
Set<String> set = newHashSet("a","b","c");
4. Java 8 Stream
随着Java 8中Stream API的引入,我们有了更多的选择,比如Stream与Collectors:
Set<String> set = Stream.of("a", "b", "c")
.collect(Collectors.toCollection(HashSet::new));
5. 使用第三方集合库
有很多第三方集合库,包括Google Guava、Apache Commons Collections和Eclipse Collections等等。
这些库提供了方便的实用方法来初始化Set等集合。由于[Google Guava](https://search.maven.org/classic/#search | ga | 1 | g%3A”com.google.guava”)是最常用的一种,我们提供了一个示例。 |
Guava为可变和不可变的Set对象提供了方便的方法:
Set<String> set = Sets.newHashSet("a", "b", "c");
同样,Guava有一个用于创建不可变Set实例的实用程序类:
Set<String> set = ImmutableSet.of("a", "b", "c");
6. 总结
在本文中,我们看到了在构造HashSet时可以对其进行初始化的多种方法。
这些方法不一定涵盖所有可能的方式,本文只是尝试展示最常见的方式。
例如,此处未涵盖的一种方法可能是使用对象生成器来构造一个Set。
与往常一样,本教程的完整源代码可在GitHub上获得。