必须用toarray(t[])而非toarray(),因后者返回object[],强转会抛classcastexception;正确写法是list.toarray(new t[0]),如string[] arr = list.toarray(new string[0])。
![java 中 arraylist 转换为 t[] 数组怎么正确使用带参数的 toarray](https://img.php.cn/upload/article/001/242/473/179098007050969.png?x-oss-process=image/resize,p_40)
Java 中将 ArrayList 转为 T[](如 String[]、Integer[] 等具体类型数组),**必须使用带参数的 toArray(T[]) 方法**,不能用无参的 toArray() —— 后者返回的是 Object[],强转会抛 ClassCastException。
为什么不能用无参 toArray()
无参 list.toArray() 总是返回 Object[],即使 ArrayList<string></string> 也一样。JVM 泛型擦除后,运行时无法知道元素真实类型,所以无法创建 String[]。直接强转:(String[]) list.toArray() → 运行时报错。
正确写法:传入一个指定类型的空数组
调用 list.toArray(new T[0]) 或 list.toArray(new T[list.size()]),推荐前者(更简洁且 JVM 优化友好):
-
new String[0]表示“请给我一个String[]”,底层会根据实际大小新建合适长度的数组并填充 - 传
new String[list.size()]也可,但如果数组够大,会复用它;不够则新建——但需提前知道 size,不灵活 - 传
null会抛NullPointerException
完整示例(String 和自定义类型)
✅ 正确:
// ArrayList<string>
ArrayList<string> list = new ArrayList(Arrays.asList("a", "b", "c"));
String[] arr1 = list.toArray(new String[0]); // 推荐
// ArrayList<person>
ArrayList<person> people = new ArrayList();
people.add(new Person("Alice"));
Person[] persons = people.toArray(new Person[0]);
// 注意:不能写成 (Person[]) list.toArray() ❌</person></person></string></string>
常见误区与注意事项
- 数组类型必须和泛型类型一致:
ArrayList<integer></integer>→new Integer[0],不能用new Number[0]或new Object[0] - 如果传入的数组长度 > list 大小,多出的位置会被设为
null(仅当复用该数组时生效) - 在 Java 11+ 中仍需手动写
new T[0],没有更简语法(list.toArray(String[]::new)是 Java 11 新增的重载,但它是另一个方法,不是带参toArray(T[]))
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











