List转数组必须用toArray(T[])并传入目标类型数组(如new String[0]),否则返回Object[]导致ClassCastException;数组转List用Arrays.asList()得不可修改视图,需new ArrayList<>包装才可修改;原始类型数组需Stream.boxed()转包装类List。

Java 中 List 和数组的互相转换很常见,核心在于理解类型安全和泛型擦除的影响,避免运行时异常。
将 List 转换为数组(推荐方式)
必须使用带参数的 toArray(T[]) 方法,传入一个与目标类型一致的数组(哪怕长度为 0),否则返回的是 Object[],强转会报 ClassCastException。
- 正确写法(类型安全):
List<String> list = Arrays.asList("a", "b", "c");
String[] arr = list.toArray(new String[0]); // 推荐用 new String[0],JVM 会自动扩容 - 不推荐写法(有风险):
String[] arr = (String[]) list.toArray(); // 编译通过,但运行时报错 - 注意:传入的数组长度小于 list 大小时,JVM 新建同类型数组返回;等于或大于时,复用该数组并用 null 填充多余位置(一般无需关心)。
将数组转换为 List(不可修改的视图)
Arrays.asList() 返回的是 Arrays 的内部静态类,它支持 get、set、contains 等操作,但不支持 add、remove、clear —— 调用会抛 UnsupportedOperationException。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 基本用法:
String[] arr = {"x", "y", "z"};
List<String> list = Arrays.asList(arr); // 注意:arr 元素必须是引用类型 - 如需可修改的 List,包装一层:
List<String> mutableList = new ArrayList<>(Arrays.asList(arr)); - 原始类型数组(如
int[])不能直接转为List<Integer>,需手动遍历或借助 Stream(Java 8+):
int[] ints = {1, 2, 3};
List<Integer> list = Arrays.stream(ints).boxed().collect(Collectors.toList());
泛型与原始类型注意事项
泛型在运行时被擦除,所以 List<String> 实际是 List,但数组保留运行时类型信息。这是为什么 toArray() 必须靠传入的数组来“告知”类型。
立即学习“Java免费学习笔记(深入)”;
- 不能用
new ArrayList<String>().toArray(new Object[0])得到String[]—— 返回的是Object[],不是子类型数组。 - 对于自定义类,确保泛型参数与数组类型严格匹配,例如:
List<User> users = ...;
User[] userArray = users.toArray(new User[0]);
Java 8+ 的 Stream 辅助转换(更灵活)
适合需要过滤、映射等中间操作的场景,也天然支持原始类型数组 → 包装类 List。
- 数组 → List(含原始类型):
double[] ds = {1.1, 2.2};
List<Double> list = DoubleStream.of(ds).boxed().collect(Collectors.toList()); - List → 数组(指定类型):
List<Integer> nums = Arrays.asList(10, 20);
Integer[] arr = nums.stream().toArray(Integer[]::new); - 注意:Stream 方式稍有性能开销,简单转换优先用传统方法。

















