线上代码报 ClassCastException,堆栈指向一行 (String[]) list.toArray(),本地小数据量测不出来,换个分支就炸。java list转数组这个操作,坑几乎都出在 toArray 的用法上。

无参 toArray 返回的是 Object[]

List 接口的 toArray() 不带参数,返回 Object[],运行时类型就是 Object 数组。写成 String[] arr = (String[]) list.toArray() 编译能过,运行直接抛异常,因为数组类型不支持这种强转。正确写法是传入目标类型的数组:

List<String> list = new ArrayList<>();
String[] arr = list.toArray(new String[0]);

传 new String[0] 让 JVM 按实际长度新建数组,JDK 11 之后还可以写 list.toArray(String[]::new),更简洁。别传 new String[list.size()],并发修改时长度对不上,虽然一般能跑但没必要。

基本类型要绕一道 stream

List<Integer> 想转 int[],toArray 帮不上忙,得拆箱:

int[] nums = list.stream().mapToInt(Integer::intValue).toArray();

反过来 int[] 转 List<Integer>,用 Arrays.stream(nums).boxed().collect(Collectors.toList())。集合里有 null 时,拆箱会抛 NullPointerException,转换前先过滤。

转完的数组能不能改

toArray 得到的是新数组,改数组元素不影响原 List,两边独立。但 Arrays.asList 返回的 List 是固定长度的,add 会抛 UnsupportedOperationException;List.of 创建的集合连 set 都不行。要可变集合就包一层 new ArrayList<>(Arrays.asList(arr))。数组和集合各有适用场景,对外接口传数组、内部处理用集合,别来回转。

java list转数组记住一句:带类型的数组参数,或者用构造器引用,别裸调 toArray 再强转。基本类型多走一步 stream,就能避开大多数坑。