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+) 需要理解构造器引用语法
相关推荐
qq_297574673 小时前
【实战教程】SpringBoot 集成阿里云短信服务实现验证码发送
spring boot·后端·阿里云
fanruitian3 小时前
uniapp android开发 测试板本与发行版本
前端·javascript·uni-app
rayufo3 小时前
【工具】列出指定文件夹下所有的目录和文件
开发语言·前端·python
RANCE_atttackkk3 小时前
[Java]实现使用邮箱找回密码的功能
java·开发语言·前端·spring boot·intellij-idea·idea
韩立学长4 小时前
【开题答辩实录分享】以《智能大学宿舍管理系统的设计与实现》为例进行选题答辩实录分享
数据库·spring boot·后端
2501_944525545 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 支出分析页面
android·开发语言·前端·javascript·flutter
李白你好5 小时前
Burp Suite插件用于自动检测Web应用程序中的未授权访问漏洞
前端
刘一说6 小时前
Vue 组件不必要的重新渲染问题解析:为什么子组件总在“无故”刷新?
前端·javascript·vue.js
编码者卢布7 小时前
【Azure Storage Account】Azure Table Storage 跨区批量迁移方案
后端·python·flask
徐同保7 小时前
React useRef 完全指南:在异步回调中访问最新的 props/state引言
前端·javascript·react.js