Java中将ArrayList转为原生数组应使用带类型参数的toArray(T[])方法,如list.toArray(new String[0]),可安全返回String[];不可用无参toArray()后强转,会抛ClassCastException;基本类型数组需手动遍历拆箱。

Java 中将 ArrayList 转为原生数组,核心是正确使用 toArray() 方法——关键不在于“能不能转”,而在于“怎么避免 ClassCastException 或返回 Object[]”。
用带类型参数的 toArray(T[]) 方法(推荐)
这是最安全、最直接的方式。必须传入一个**指定泛型类型的数组**(哪怕长度为 0),JVM 才能推断目标类型并返回正确类型的数组。
- 写法:调用
list.toArray(new String[0])(假设 list 是ArrayList<String>) - 好处:返回的是
String[],不是Object[];空数组也完全安全,JVM 会自动创建合适大小的新数组 - 常见错误写法:
list.toArray(new String[list.size()])—— 不必要,且易因 size 变化导致冗余或越界
别用无参 toArray() 直接强转
list.toArray() 永远返回 Object[],即使 List 存的是 String。以下代码会抛 ClassCastException:
String[] arr = (String[]) list.toArray(); // ❌ 运行时报错
立即学习“Java免费学习笔记(深入)”;
因为 Object[] 和 String[] 是不同运行时类型,不能直接强转(除非数组实际是 String[] 创建的,但 toArray() 内部用的是 new Object[n])。
基本类型数组?List 不支持,得手动遍历
ArrayList 只能存包装类(如 Integer),不能直接转成 int[]。必须手动提取并拆箱:
- 用传统 for 循环:
int[] arr = new int[list.size()]; for (int i = 0; i - Java 8+ 可用 Stream:
int[] arr = list.stream().mapToInt(Integer::intValue).toArray(); - 注意:Stream 方式创建新流、装箱/拆箱有开销,大数据量时循环更高效
泛型擦除不影响 toArray(T[]) 的类型安全
虽然编译后泛型信息被擦除,但 toArray(new T[0]) 中的数组实例仍携带运行时类型(如 String[].class),JVM 利用它来创建并返回正确类型的数组。所以只要传对数组类型,就不会出错。


















