Java:List.toArray(new T)

`List.toArray(new T)` 是 Java 中将列表安全转换为指定类型数组的标准写法利用空数组传递运行时类型信息,避免 `ClassCastException` 且现代 JVM 已对其深度优化 。

用法与原理
- 完整语法:`T[] array = list.toArray(new T);`(`T` 为元素类型,如 `String`、`Integer`)
- 作用机制:参数 `new T` 仅用于告知方法目标数组的组件类型;因长度不足,JVM 内部会反射创建正确大小的新数组并填充元素,返回类型与声明一致,无需强转
- 为何推荐 `new T`:相比 `new T[list.size()]`,代码更简洁,且避免了并发下 `size()` 变化导致的长度不匹配风险;自 JDK 6+ 起性能已等同甚至优于预分配数组 。
- 常见错误:直接调用无参 `toArray()` 返回 `Object[]`,强制转为具体类型数组(如 `(String[])`)会在运行时抛出 `ClassCastException` 。

两种重载对比
1. 无参版 `list.toArray()`:返回 `Object[]`,需手动遍历转换元素,强转整个数组会报错。
2. 带参版 `list.toArray(new T)`:直接返回 `T[]` 类型数组,类型安全,推荐默认使用。

注意事项
- 仅支持引用类型:泛型不支持基本类型(如 `int`),`List<int>` 非法;若需 `int[]`,须通过 Stream `mapToInt` 转换 。
- 泛型类中传递:在泛型方法/类中无法直接 `new T`,需由调用方传入模板数组或使用 `Class<T>` 反射创建 。
- 特殊集合:`CopyOnWriteArrayList` 等并发集合对 `new T` 无额外优化,但用法依然安全有效 。

示例代码:
```java
List<String> list = Arrays.asList("A", "B");
String[] arr = list.toArray(new String); // 正确,arr 类型为 String