231. Java 集合 - 将集合元素转换为数组
在实际开发中,虽然用集合(Collection)来存储元素通常更灵活,但有些场景下,我们仍然需要将集合转换成数组 (比如与老旧 API 交互、需要固定大小存储等)。
Java 的 Collection 接口提供了 三种方式 来实现这一点,都是通过 toArray() 方法的不同重载实现的。
🌟 三种 toArray() 使用方式
| 方法 | 返回 | 特点 |
|---|---|---|
toArray() |
Object[] |
返回一个对象数组,不带类型信息 |
toArray(T[] array) |
T[] |
返回一个指定类型的数组,需要传入一个数组 |
toArray(IntFunction<T[]> generator) |
T[] |
使用构造器引用 创建数组,代码更简洁(JDK 8+) |
1. 🛠️ 使用无参 toArray()
这种方式最简单:直接调用 toArray(),返回的是一个 Object[] 类型的数组。
java
Collection<String> strings = List.of("one", "two", "three");
Object[] array = strings.toArray();
System.out.println(Arrays.toString(array));
🖨️ 输出结果:
java
[one, two, three]
⚠️ 注意 : 这种方式得到的是 Object[],如果你强制转换成 String[],可能会在运行时抛出异常 (ClassCastException)。 因此,一般不推荐在需要明确类型时使用这种方式。
2. 🛠️ 使用带数组参数的 toArray(T[] array)
这种方式可以直接得到正确类型 的数组,比如 String[],而且避免类型转换出错。
java
Collection<String> strings = List.of("one", "two");
// 方式1:传入一个长度为0的数组
String[] result1 = strings.toArray(new String[0]);
System.out.println(Arrays.toString(result1));
// 方式2:传入一个足够大的数组
String[] largerArray = new String[5];
String[] result2 = strings.toArray(largerArray);
System.out.println(Arrays.toString(result2));
🖨️ 输出结果:
java
[one, two]
[one, two, null, null, null]
✨ 背后细节解释
- 如果传入的数组长度大于等于集合的大小,元素将被直接拷贝到这个数组中;
- 如果传入的数组长度小于 集合的大小,Java会创建一个新数组,大小正好适配集合元素;
- 如果数组比集合大,拷贝完元素后,第一个空余位置会设为
null,剩下的位置保持原值。
🔥 示例:传入比集合大的数组
java
Collection<String> strings = List.of("one", "two");
String[] largerTab = {"old1", "old2", "old3", "old4"};
System.out.println("Before: " + Arrays.toString(largerTab));
String[] result = strings.toArray(largerTab);
System.out.println("After : " + Arrays.toString(result));
System.out.println("Same array? " + (result == largerTab));
🖨️ 输出结果:
java
Before: [old1, old2, old3, old4]
After : [one, two, null, old4]
Same array? true
✅ 注意 :返回的是传入的原数组,而不是新建的数组!
3. 🛠️ 使用 toArray(IntFunction<T[]> generator)(推荐)
从 Java 11 开始,你可以使用构造器引用 (例如 String[]::new)来创建数组,更加优雅、简洁!
java
Collection<String> strings = List.of("one", "two", "three");
String[] array = strings.toArray(String[]::new);
System.out.println(Arrays.toString(array));
🖨️ 输出结果:
java
[one, two, three]
🎯 小结
| 方法 | 优点 | 缺点 |
|---|---|---|
toArray() |
简单直接 | 只返回 Object[],需要小心类型 |
toArray(T[] array) |
返回指定类型,兼容老版本Java | 代码稍长,需要处理数组长度 |
toArray(IntFunction<T[]> generator) |
代码最简洁,推荐(Java 11+) | 需要理解构造器引用语法 |