231. Java 集合 - 将集合元素转换为数组

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+) 需要理解构造器引用语法
相关推荐
gelald3 小时前
ReentrantLock 学习笔记
java·后端
计算机学姐3 小时前
基于SpringBoot的校园资源共享系统【个性化推荐算法+数据可视化统计】
java·vue.js·spring boot·后端·mysql·spring·信息可视化
智航GIS3 小时前
10.7 pyspider 库入门
开发语言·前端·python
J_liaty3 小时前
RabbitMQ面试题终极指南
开发语言·后端·面试·rabbitmq
华仔啊4 小时前
写 CSS 用 px?这 3 个单位能让页面自动适配屏幕
前端·css
BD_Marathon4 小时前
SpringBoot程序快速启动
java·spring boot·后端
静听松涛1334 小时前
提示词注入攻击的防御机制
前端·javascript·easyui
晚风予星4 小时前
简记 | 一个基于 AntD 的高效 useDrawer Hooks
前端·react.js·设计
行百里er4 小时前
代码跑得慢?让Spring的StopWatch告诉你真相!
java·后端·github
栗子叶4 小时前
网页接收服务端消息的几种方式
前端·websocket·http·通信