带参 toArray(T[]) 更安全,因它返回指定类型数组,避免强制转换和 ClassCastException;传入类型匹配、长度合理的数组(如 new String[0])可确保类型安全与语义清晰。

泛型集合调用 toArray(T[]) 方法,能直接返回指定类型的数组,避免强制类型转换和 ClassCastException。关键在于传入一个**类型匹配、长度合理的数组引用**,而非仅仅依赖无参 toArray() 返回 Object[]。
为什么带参 toArray(T[]) 更安全?
无参 toArray() 总是返回 Object[],哪怕集合实际装的是 String,你也不能直接把它当作 String[] 用——JVM 不允许 Object[] 向下转型为具体类型数组。而带参版本会尝试复用你传入的数组(如果够大),或新建一个同类型数组,确保返回值就是你要的 T[]。
正确传参的两种典型写法
-
传入空数组(推荐):
list.toArray(new String[0])。JDK 1.8+ 对这种写法做了优化,即使传 0 长度数组,也会内部新建合适大小的String[],语义清晰且无冗余对象。 -
传入预分配数组(兼容老代码):
list.toArray(new String[list.size()])。若集合未扩容,可复用该数组;但若集合后续扩容,仍会新建数组返回,所以长度不严格要求必须等于 size。
常见错误与避坑点
-
传 null 数组: 抛
NullPointerException,方法明确要求非 null 参数。 -
传错类型数组: 如
list<string>.toArray(new Integer[0])</string>,编译报错(类型不匹配),Java 泛型在编译期就拦截了。 -
忽略返回值直接强转: 即使你传了
new String[5],也必须接收返回值:String[] arr = list.toArray(new String[5]);,不能假设原数组被填充(它可能被替换)。
完整示例:从 List 到 int[] 的注意点
⚠️ 注意:toArray(T[]) 只支持引用类型(如 Integer[]),不支持基本类型(int[])。若需 int[],得手动遍历或用 Stream:list.stream().mapToInt(Integer::intValue).toArray()。
对于引用类型,这样写即可:
ListString[] arr = words.toArray(new String[0]); // 安全、简洁、类型明确

















