list转数组必须用toarray(t[])并传入目标类型数组(如new string[0]),否则返回object[]导致classcastexception;数组转list用arrays.aslist()得不可修改视图,需new arraylist包装才可修改;原始类型数组需stream.boxed()转包装类list。

Java 中 List 和数组的互相转换很常见,核心在于理解类型安全和泛型擦除的影响,避免运行时异常。
将 List 转换为数组(推荐方式)
必须使用带参数的 toArray(T[]) 方法,传入一个与目标类型一致的数组(哪怕长度为 0),否则返回的是 Object[],强转会报 ClassCastException。
- 正确写法(类型安全):
Listlist = 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。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 基本用法:
String[] arr = {"x", "y", "z"};
Listlist = Arrays.asList(arr); // 注意:arr 元素必须是引用类型 - 如需可修改的 List,包装一层:
ListmutableList = new ArrayList(Arrays.asList(arr)); - 原始类型数组(如
int[])不能直接转为List<integer></integer>,需手动遍历或借助 Stream(Java 8+):
int[] ints = {1, 2, 3};
Listlist = Arrays.stream(ints).boxed().collect(Collectors.toList());
泛型与原始类型注意事项
泛型在运行时被擦除,所以 List<string></string> 实际是 List,但数组保留运行时类型信息。这是为什么 toArray() 必须靠传入的数组来“告知”类型。
- 不能用
new ArrayList<string>().toArray(new Object[0])</string>得到String[]—— 返回的是Object[],不是子类型数组。 - 对于自定义类,确保泛型参数与数组类型严格匹配,例如:
Listusers = ...;
User[] userArray = users.toArray(new User[0]);
Java 8+ 的 Stream 辅助转换(更灵活)
适合需要过滤、映射等中间操作的场景,也天然支持原始类型数组 → 包装类 List。
- 数组 → List(含原始类型):
double[] ds = {1.1, 2.2};
Listlist = DoubleStream.of(ds).boxed().collect(Collectors.toList()); - List → 数组(指定类型):
Listnums = Arrays.asList(10, 20);
Integer[] arr = nums.stream().toArray(Integer[]::new); - 注意:Stream 方式稍有性能开销,简单转换优先用传统方法。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










