在 Java 中,int[]
与 ArrayList<Integer>
是两种常用的数据结构。由于 int[]
是基本数据类型数组,而 ArrayList<Integer>
是对象集合类型,两者的转换需要注意类型转换的细节。以下是完整的讲解和实现方法。
1. int[] 转换为 ArrayList
方法 1:使用手动遍历
通过遍历数组,将每个元素逐一添加到 ArrayList<Integer>
中。
代码实现
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5};
// 转换为 ArrayList
ArrayList<Integer> list = new ArrayList<>();
for (int num : array) {
list.add(num);
}
System.out.println(list); // 输出: [1, 2, 3, 4, 5]
}
}
说明
- 手动遍历适合任何版本的 Java。
- 时间复杂度:
O
(
n
)
O(n)
O(n),
n
是数组的长度。
方法 2:使用 Java 8 Stream
通过 Arrays.stream()
和 boxed()
方法,将 int[]
转换为 Stream<Integer>
,再收集到 ArrayList<Integer>
。
代码实现
import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5};
// 使用 Stream 转换为 ArrayList
ArrayList<Integer> list = Arrays.stream(array)
.boxed() // 转为 Integer 类型
.collect(Collectors.toCollection(ArrayList::new));
System.out.println(list); // 输出: [1, 2, 3, 4, 5]
}
}
说明
- 适用于 Java 8 及以上版本。
- 使用
boxed()
将基本类型int
转换为包装类型Integer
。
2. ArrayList 转换为 int[]
方法 1:使用手动遍历
通过遍历 ArrayList<Integer>
,逐一将元素添加到 int[]
中。
代码实现
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
// 转换为 int[]
int[] array = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
array[i] = list.get(i); // 拆箱 Integer -> int
}
System.out.println(Arrays.toString(array)); // 输出: [1, 2, 3]
}
}
说明
- 手动遍历适合任何版本的 Java。
- 通过
list.get(i)
获取元素并自动拆箱为int
。
方法 2:使用 Java 8 Stream
通过 Stream.mapToInt()
将 ArrayList<Integer>
转换为 int[]
。
代码实现
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
// 使用 Stream 转换为 int[]
int[] array = list.stream()
.mapToInt(Integer::intValue) // 转为 int 类型
.toArray();
System.out.println(Arrays.toString(array)); // 输出: [1, 2, 3]
}
}
说明
- 适用于 Java 8 及以上版本。
- 使用
mapToInt()
方法完成从Integer
到int
的转换。
3. 综合示例
以下代码实现了 int[]
和 ArrayList<Integer>
的双向转换。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
// int[] 转 ArrayList<Integer>
int[] array = {1, 2, 3, 4, 5};
ArrayList<Integer> list = Arrays.stream(array)
.boxed() // 转换为 Integer
.collect(Collectors.toCollection(ArrayList::new));
System.out.println("int[] -> ArrayList<Integer>: " + list);
// ArrayList<Integer> 转 int[]
int[] newArray = list.stream()
.mapToInt(Integer::intValue) // 转换为 int
.toArray();
System.out.println("ArrayList<Integer> -> int[]: " + Arrays.toString(newArray));
}
}
运行结果
int[] -> ArrayList<Integer>: [1, 2, 3, 4, 5]
ArrayList<Integer> -> int[]: [1, 2, 3, 4, 5]
4. 注意事项
-
自动装箱与拆箱:
- 从
int
转换为Integer
是自动装箱。 - 从
Integer
转换为int
是自动拆箱。 - 手动遍历时,这些操作由 JVM 自动完成。
- 从
-
null
的处理:- 如果
ArrayList<Integer>
包含null
,在转换为int[]
时会抛出NullPointerException
。 - 示例:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, null, 3)); int[] array = list.stream().mapToInt(Integer::intValue).toArray(); // 抛出 NullPointerException
- 如果
-
性能:
- 手动遍历方法比
Stream
方法稍快,适用于性能敏感场景。 Stream
方法代码更简洁,推荐在现代 Java 项目中使用。
- 手动遍历方法比
5. 方法对比
转换方向 | 方法 | 优点 | 缺点 |
---|---|---|---|
int[] -> ArrayList | 手动遍历 | 简单、高效 | 代码稍显冗长 |
Stream.boxed() | 代码简洁,现代风格 | Java 8 及以上支持 | |
ArrayList -> int[] | 手动遍历 | 简单、高效 | 代码稍显冗长 |
Stream.mapToInt() | 代码简洁,现代风格 | Java 8 及以上支持 |
6. 总结
- 推荐方案:
- 如果使用 Java 8 或更高版本,优先使用
Stream
,代码更简洁。 - 对性能要求高的场景,可以选择手动遍历。
- 如果使用 Java 8 或更高版本,优先使用
- 核心操作:
boxed()
:将基本类型转换为包装类型。mapToInt()
:将包装类型转换为基本类型。