1. 概述

在Java中,数组(Arrays)和哈希集合(HashSet)都用于存储元素集合。它们在底层实现和适用场景上有所不同:数组可以存储基本类型,而哈希集合则不能。本教程将指导您如何使用多种方法将int[]转换为HashSet<Integer>

2. 理解场景

首先,初始化一个int[]数组arr

int[] arr = { 1, 2, 3, 4, 5 };

接着,我们定义期望的结果,一个名为expectedHashSet<Integer>

HashSet<Integer> expected = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5));

尝试使用Arrays.asList()方法创建列表并传递给HashSet构造函数:

HashSet<Integer> result = new HashSet<>(Arrays.asList(arr));

遗憾的是,编译器不允许这样做,并抛出错误:

java: incompatible types: cannot infer type arguments for java.util.HashSet<>
    reason: inference variable E has incompatible bounds
      equality constraints: java.lang.Integer
      lower bounds: T,int[]

这表明它未能正确推断类型

最后确认,这种方法得到的是int[]类型的HashSet而非HashSet<Integer>

HashSet<int[]> result = new HashSet<>(Arrays.asList(arr));
assertEquals(1, result.size());
assertNotEquals(expected, result);

值得注意的是,HashSet中包含的是单个int[]类型的元素。

3. 使用循环

解决这个问题的最直接方法是遍历数组,使用for循环将每个成员添加到result HashSet中

HashSet<Integer> result = new HashSet<>();
for (int num : arr) {
    result.add(num);
}

然后通过断言result等于expected HashSet进行验证:

assertEquals(expected, result);

成功!结果符合预期。

4. 使用Java流

从Java 8及更高版本开始,我们可以利用流(Stream)来实现:

首先,使用Arrays.stream()int数组生成整数流,然后经过中间处理后将每个整数收集到HashSet中:

HashSet<Integer> result = Arrays.stream(arr)
  .boxed()
  .collect(Collectors.toCollection(HashSet::new));

需要注意的是,我们使用了boxed()方法将int类型转换为Integer类型。

验证我们的实现:

assertEquals(expected, result);

完美!得到正确的结果。

5. 使用 Commons Lang 库

现在,我们将学习如何使用Apache Commons Lang库来解决这个问题。

5.1. Maven 依赖

首先,在pom.xml文件中添加对commons-lang3库的依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.14.0</version>
</dependency>

准备好了,可以使用这个库。

5.2. 使用 ArrayUtils.toObject() 方法

接下来,使用ArrayUtils.toObject()方法将数组从int类型转换为Integer类型:

然后,我们可以将对象类型传递给Arrays.asList()方法并创建HashSet对象:

HashSet<Integer> result = new HashSet<>(Arrays.asList(ArrayUtils.toObject(arr)));

同样,测试代码以确保信心:

assertEquals(expected, result);

太棒了!看起来我们做得很好。

6. 使用Guava库

接下来,我们探讨如何使用Guava库解决问题。

6.1. Maven 依赖

在使用库方法之前,先在项目pom.xml文件中添加对guava库的依赖:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>32.1.2-jre</version>
</dependency>

现在可以使用这个库。

6.2. 使用 Ints.asList() 方法

我们可以使用Ints.asList()方法获取包含int数组所有成员的Integer列表。因此,这个方法不需要Arrays.asList()

现在,直接创建结果HashSet,传入Integer类型的列表:

HashSet<Integer> result = new HashSet<>(Ints.asList(arr));

别忘了测试我们的方法:

assertEquals(expected, result);

如预期工作。

7. 总结

本文介绍了如何将int[]转换为更便于数据处理的HashSet集合。我们使用了原生方法(如循环结构和Java流),同时也探索了Apache Commons Lang和Google Guava这样的流行库来处理问题。

完整教程的源代码可在GitHub上查看:GitHub