1. Overview
1.概述
In this quick tutorial, we’ll introduce various methods of initializing the HashSet with values, at the time of its construction.
在这个快速教程中,我们将介绍在构建HashSet时用数值初始化的各种方法。
To instead explore the features of HashSet, refer to this core article here.
如果要探索HashSet的特性,请参考这里的核心文章。
We’ll dive into Java built-in methods since Java 5 and before, followed by new mechanisms introduced since Java 8.
我们将深入研究Java的内置方法自Java 5及以前的,然后是自Java 8引入的新机制。
We’ll also see a custom utility method and finally explore the features provided by third-party collection libraries, Google Guava in particular.
我们还将看到一个定制的实用方法,最后探索第三方集合库提供的功能,特别是Google Guava。
If we’ve already migrated to JDK9+, we can simply use collection factory methods.
如果我们已经迁移到JDK9+,我们可以简单地使用collection工厂方法。
2. Java Built-In Methods
Java内置方法
Let’s begin by examining three built-in mechanisms available since Java 5 or before.
让我们首先检查一下自Java 5或之前就有的三种内置机制。
2.1. Using Another Collection Instance
2.1.使用另一个集合实例
We can pass an existing instance of another collection to initialize the Set.
我们可以传递一个现有的另一个集合的实例来初始化Set。
Here we are using an inline-created List:
这里我们使用一个内联创建的List。
Set<String> set = new HashSet<>(Arrays.asList("a", "b", "c"));
2.2. Using Anonymous Class
2.2.使用匿名类
In yet another approach, we can use the anonymous class to add an element to HashSet.
在另一种方法中,我们可以使用匿名类来向HashSet添加一个元素。
Note the use of double curly braces. This approach is technically very expensive because it creates an anonymous class each time it’s called.
注意双大括号的使用。这种方法在技术上是非常昂贵的,因为它每次调用都会创建一个匿名类。
So, depending on how frequently we need to initialize Set, we can try to avoid using this approach:
因此,根据我们需要初始化Set的频率,我们可以尝试避免使用这种方法。
Set<String> set = new HashSet<String>(){{
add("a");
add("b");
add("c");
}};
2.3. Using Collections Utility Method Since Java 5
2.3.从Java 5开始使用集合实用方法
The Java’s Collections utility class provides the method named singleton to create a Set with a single element. The Set instance created with the singleton method is immutable, meaning that we cannot add more values to it.
Java的Collections utility类提供了名为singleton的方法来创建一个具有单个元素的Set。用singleton方法创建的Set实例是immutable,意味着我们不能向它添加更多的值。
There are situations especially in unit testing where we need to create a Set with a single value:
有些情况下,尤其是在单元测试中,我们需要用一个单一的值来创建一个Set。
Set<String> set = Collections.singleton("a");
3. Defining Custom Utility Method
3.定义自定义实用方法
We can define a static final method as below. The method accepts variable arguments.
我们可以定义一个static final方法,如下所示。该方法接受变量参数。。
Using Collections.addAll, which accepts the collection object and an array of values, is best among others because of the low overhead of copying values.
使用Collections.addAll,它接受集合对象和一个值数组,是最好的,因为复制值的开销很低。
The method uses generics so we can pass values of any type:
该方法使用泛型,所以我们可以传递任何类型的值。
public static final <T> Set<T> newHashSet(T... objs) {
Set<T> set = new HashSet<T>();
Collections.addAll(set, objs);
return set;
}
Here’s how we can use the utility method in our code:
下面是我们如何在代码中使用该实用方法。
Set<String> set = newHashSet("a","b","c");
4. Using Stream Since Java 8
4.使用Stream自Java 8开始
With the introduction of Stream API in Java 8, we have additional options such as Stream with Collectors:
随着Stream API在Java 8中的引入,我们有了更多的选择,比如Stream与Collectors。
Set<String> set = Stream.of("a", "b", "c")
.collect(Collectors.toCollection(HashSet::new));
5. Using Third-Party Collection Library
5.使用第三方收集库
There are multiple third-party collections libraries including Google Guava, Apache Commons Collections and Eclipse Collections just to name a few.
有多个第三方集合库,包括Google Guava、Apache Commons Collections和Eclipse Collections,仅举几例。
These libraries provide convenient utility methods to initialize collections like Set. Since Google Guava is one of the most commonly used, we’ve included an example from it.
这些库提供了方便的实用方法来初始化像Set这样的集合。由于Google Guava是最常用的一个,我们已经包括了它的一个例子。
Guava has convenient methods for mutable and immutable Set objects:
Guava为可变和不可变的Set对象提供了方便的方法。
Set<String> set = Sets.newHashSet("a", "b", "c");
Similarly, Guava has a utility class for creating immutable Set instances:
同样地,Guava有一个实用类用于创建不可变的Set实例。
Set<String> set = ImmutableSet.of("a", "b", "c");
6. Conclusion
6.结语
In this article, we saw multiple ways in which a HashSet can be initialized while it is constructed.
在这篇文章中,我们看到了在构建HashSet时可以对其进行初始化的多种方式。
These approaches don’t necessarily cover all possible ways by any means. This article is just an attempt to showcase the most common ways.
这些方法不一定涵盖所有可能的方式。这篇文章只是试图展示最常见的方法。
For example, one approach not covered here could be using the object builder to construct a Set.
例如,这里没有涉及的一种方法是使用对象构建器来构建一个Set。
As always, the working code example is available over on GitHub.
一如既往,工作代码的例子可在GitHub上找到。