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