在 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};// 转换为 ArrayListArrayList<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 转换为 ArrayListArrayList<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()
:将包装类型转换为基本类型。