ArrayList转对象数组推荐用toArray(new Type[0]),类型安全且性能无损;转基本类型数组需手动拆箱,可用Stream或传统循环实现。

Java 中 ArrayList 转换为普通数组最常用、推荐的方式是使用 toArray(T[]) 方法,传入一个**指定类型且长度足够的数组**(通常用空数组 new Type[0] 即可)。
用 toArray(new Type[0]) 安全转成对象数组
这是现代 Java(JDK 5+)中类型安全、简洁可靠的做法:
- 传入一个**泛型匹配的空数组**(如
new String[0]),方法会自动创建并返回正确类型的数组; - 避免了老式
toArray()(无参)返回Object[]后强转带来的ClassCastException风险; - 即使传
new String[0],JVM 也会根据 ArrayList 大小新建合适长度的数组,性能无损。
示例:
ArrayList<String> list = new ArrayList<>();
list.add("a"); list.add("b"); list.add("c");
String[] arr = list.toArray(new String[0]); // ✅ 推荐写法
// arr 是 String[],内容为 {"a", "b", "c"}
如果要转成基本类型数组(如 int[]),需手动遍历
ArrayList 只能存引用类型(如 Integer),不能直接转成 int[] 等基本类型数组,必须逐个拆箱:
立即学习“Java免费学习笔记(深入)”;
- 无法用
toArray()直接得到int[]; - 可用传统 for 循环、增强 for 或 Stream(JDK 8+)实现;
- Stream 方式简洁但有轻微开销,适合逻辑清晰优先的场景。
示例(Stream):
ArrayList<Integer> intList = new ArrayList<>(Arrays.asList(1, 2, 3)); int[] intArr = intList.stream().mapToInt(Integer::intValue).toArray();
示例(传统循环):
int[] intArr = new int[intList.size()];
for (int i = 0; i < intList.size(); i++) {
intArr[i] = intList.get(i);
}
不推荐的写法:toArray() 无参 + 强转
以下代码在编译时通过,运行时抛 ClassCastException:
// ❌ 危险!运行时报错 Object[] objArr = list.toArray(); // 返回 Object[] String[] strArr = (String[]) objArr; // ClassCastException!
原因:底层实际创建的是 Object[],不是 String[],强制转型失败。
小技巧:用 new Type[list.size()] 也可以,但没必要
有人写 list.toArray(new String[list.size()]) —— 这能工作,但多做了事:
- 如果数组长度 ≥ list 大小,直接填充并返回该数组;
- 但如果 list 增长了,你预先分配的数组可能不够,而
new Type[0]更通用、语义更清晰; - 现代 JVM 对
new Type[0]优化良好,无需担心性能。


















