最推荐的方式是使用 toarray(t[]) 方法传入空数组,如 list.toarray(new string[0]),可安全返回指定类型数组;不能用无参 toarray() 强转,会抛 classcastexception;基本类型数组需手动遍历转换。

Java 中 ArrayList 转数组最常用、最推荐的方式是使用 toArray(T[]) 方法,传入一个与目标类型匹配的数组(通常是空数组),它能安全返回指定类型的数组,避免类型擦除带来的问题。
用 toArray(new Type[0]) 安全转为对象数组
这是现代 Java(JDK 1.5+)的标准写法,简洁且类型安全:
- 传入一个长度为 0 的目标类型数组(如
new String[0]),ArrayList 会根据实际大小新建并返回正确长度的数组 - 不会因传入过大的数组而浪费空间,也不会因传入 null 或错误类型抛异常
- 示例:List
list = Arrays.asList("a", "b", "c");
String[] arr = list.toArray(new String[0]);
不能直接用 toArray() 得到泛型数组
toArray()(无参)只返回 Object[],无法强转为 String[] 等具体类型数组:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 下面这行会编译通过但运行时报
ClassCastException:String[] arr = (String[]) list.toArray(); - 因为泛型在运行时被擦除,
toArray()实际返回的是Object[],而Object[]和String[]是不同类,不可强制转换
基本类型数组需要手动遍历或借助工具类
ArrayList 只能存包装类型(如 Integer),不能直接转成 int[] 等基本类型数组:
- 需遍历赋值:List
list = Arrays.asList(1, 2, 3);
int[] arr = new int[list.size()];
for (int i = 0; i - 也可用 Stream(Java 8+):int[] arr = list.stream().mapToInt(Integer::intValue).toArray();
- 注意:Apache Commons Lang 的
ArrayUtils.toPrimitive()或 Guava 的Ints.toArray()也能简化操作
小技巧:用 new Type[0] 比 new Type[list.size()] 更优
虽然传入已知大小的数组(如 new String[list.size()])也能工作,但推荐用 new String[0]:
- 避免因并发修改导致 size 不一致而分配过大/过小数组
- HotSpot JVM 对
new Type[0]有专门优化,性能几乎无差异 - 代码更简洁,语义更清晰——“请给我一个正确类型的数组,大小你来定”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










