java 数组转List
在Java中,将数组转换为List有多种方法,但不同方法在可变性、对基本类型的支持、依赖库等方面存在差异。以下是详细总结及示例:
1. 使用 Arrays.asList()(不可变列表)
- 特点:生成的
List是固定大小(基于原始数组的视图),不可添加/删除元素,但可修改元素值。 - 示例:
String[] arr = {"A", "B", "C"}; List<String> list = Arrays.asList(arr); list.set(0, "X"); // 允许修改元素 // list.add("D"); // 抛出 UnsupportedOperationException - 陷阱:
- 若数组是基本类型(如
int[]),Arrays.asList()会将整个数组视为单个元素:int[] nums = {1, 2, 3}; List<int[]> wrongList = Arrays.asList(nums); // List<int[]>,而非List<Integer>
- 若数组是基本类型(如
2. 包装为 new ArrayList<>()(可变列表)
- 特点:通过构造新
ArrayList,允许增删元素。 - 示例:
String[] arr = {"A", "B", "C"}; List<String> list = new ArrayList<>(Arrays.asList(arr)); list.add("D"); // 允许操作
3. Java 8+ 的 Stream(支持基本类型)
- 特点:通过流处理,支持基本类型数组转换,生成可变列表。
- 示例:
或显式指定集合类型:int[] nums = {1, 2, 3}; List<Integer> list = Arrays.stream(nums) .boxed() // 装箱为Integer .collect(Collectors.toList());List<Integer> list = Arrays.stream(nums) .boxed() .collect(Collectors.toCollection(ArrayList::new));
4. 手动遍历添加(灵活但繁琐)
- 特点:逐个添加元素到新列表,适合复杂逻辑。
- 示例:
String[] arr = {"A", "B", "C"}; List<String> list = new ArrayList<>(); for (String s : arr) { list.add(s); } // 或使用 Collections.addAll() Collections.addAll(list, arr);
5. 第三方库(需引入依赖)
(1) Guava 的 Lists.newArrayList()
import com.google.common.collect.Lists;
List<String> list = Lists.newArrayList(arr);
(2) Apache Commons 的 ListUtils.toList()
import org.apache.commons.collections4.ListUtils;
List<String> list = ListUtils.toList(arr);
6. 处理基本类型数组
- 问题:直接转换基本类型数组会得到包含数组的
List,需特殊处理。 - 解决方案:
int[] nums = {1, 2, 3}; // 方法1:遍历装箱 List<Integer> list = new ArrayList<>(); for (int num : nums) { list.add(num); } // 方法2:使用Stream List<Integer> list = IntStream.of(nums) .boxed() .collect(Collectors.toList());
总结
| 方法 | 可变性 | 支持基本类型 | 依赖库 | 适用场景 |
|---|---|---|---|---|
Arrays.asList() |
不可变 | 否 | 无 | 快速只读访问 |
new ArrayList<>() |
可变 | 否 | 无 | 需增删操作 |
Java 8 Stream |
可变 | 是 | 无 | 处理基本类型或链式操作 |
| 手动遍历 | 可变 | 是 | 无 | 需要自定义逻辑 |
| Guava/Apache Commons | 可变 | 是 | 需引入 | 项目中已使用第三方库 |
最佳实践:
- 若需可变列表且非基本类型:优先使用
new ArrayList<>(Arrays.asList(array))。 - 处理基本类型数组:使用
Stream或手动遍历。 - 避免直接操作
Arrays.asList()生成的列表(除非明确只读需求)。

浙公网安备 33010602011771号