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+) 需要理解构造器引用语法
相关推荐
kyriewen4 小时前
Webpack vs Vite:一个是“老黄牛”,一个是“猎豹”,你选谁?
前端·webpack·vite
打小就很皮...4 小时前
html2canvas + jsPDF 生成 PDF 的踩坑与解决方案总结
前端·pdf
全栈前端老曹4 小时前
【前端地图】多地图平台适配方案——高德、百度、腾讯、Google Maps SDK 差异对比、封装统一地图接口
前端·javascript·百度·dubbo·wgs84·gcj-02·bd09
北风toto5 小时前
Spring Boot / Spring Cloud 配置文件加密详解:使用 jasypt-spring-boot 实现 ENC() 加密
spring boot·后端·spring cloud
代码羊羊5 小时前
Rust 格式化输出完全攻略:从入门到精通
开发语言·后端·rust
Rust研习社5 小时前
Rust + PostgreSQL 极简技术栈应用开发
开发语言·数据库·后端·http·postgresql·rust
雾岛听风6915 小时前
JavaScript基础语法速查手册
开发语言·前端·javascript
遇见~未来5 小时前
第三篇_现代布局_从弹性到网格
前端·css3
geovindu5 小时前
go:Template Method Pattern
开发语言·后端·设计模式·golang·模板方法模式
前端那点事5 小时前
Vue前端SEO优化全攻略(实操落地版,新手也能上手)
前端·vue.js