toarray()最常用但需防泛型擦除:无参返回object[],不可强转;应传入类型化空数组如new string[0];stream可转基本类型数组;arrays.aslist()是反向操作;并发集合toarray()返回安全快照;大集合慎用以防gc压力。

用 toArray() 方法最常用,但必须注意泛型擦除问题
Java 集合本身不存泛型信息,toArray() 无参版本返回 Object[],不能直接强转为具体类型数组(比如 String[]),否则会抛 ClassCastException。
正确做法是传入一个带类型的空数组作为参数:
-
list.toArray(new String[0])— 推荐写法,传入长度为 0 的数组,JVM 会自动创建合适大小的新数组 -
list.toArray(new String[list.size()])— 效率略高(避免一次扩容),但需确保 list 不为空或手动判空 - 别写
(String[])list.toArray()— 运行时必崩
Stream API 转数组适用于 Java 8+,支持基本类型包装
如果集合元素是包装类(如 Integer),想转成基本类型数组(如 int[]),toArray() 无法做到,必须走 Stream:
-
list.stream().mapToInt(Integer::intValue).toArray()→ 得到int[] -
list.stream().map(String::toUpperCase).toArray(String[]::new)→ 自定义构造器,等价于toArray(new String[0]) - 注意:Stream 是一次性操作,多次调用需重新获取 stream
Arrays.asList() 是反向操作,别混淆方向
Arrays.asList(arr) 是把数组转成 List,不是集合转数组。它返回的是固定大小的 List,底层仍引用原数组;对它调用 add() 或 remove() 会抛 UnsupportedOperationException。
立即学习“Java免费学习笔记(深入)”;
常见误用场景:
- 把
Arrays.asList(strArray).toArray()当作“复制数组”——其实没意义,原数组已是数组 - 期望用
Arrays.asList(...).toArray(new X[10])扩容——无效,返回数组长度仍等于原 list 大小
并发集合(如 CopyOnWriteArrayList)转数组是安全快照
这类集合的 toArray() 方法会在调用瞬间做一次底层数组的完整拷贝,返回的是调用时刻的快照,不受后续并发修改影响。
但要注意:
- 快照是“当时”的状态,不是实时同步
- 大集合频繁调用
toArray()会带来明显内存与 GC 压力 - 如果只是遍历,优先考虑增强 for 或 iterator,避免无谓拷贝









