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+) 需要理解构造器引用语法
相关推荐
独泪了无痕几秒前
Vue3中防御XSS攻击的“特效药”-DOMPurify
前端·vue.js·安全
小小199211 分钟前
idea 配置less转化为css
前端·css·less
hhb_61814 分钟前
Less嵌套避坑:优先级冲突实战解析
前端·css·less
云水一下24 分钟前
Vue.js从零到精通系列(五):全局状态管理——Pinia 核心与实践
前端·javascript·vue.js
我不是外星人32 分钟前
浅谈我对 AI 发展的看法
前端·ai编程·claude
码不停蹄的玄黓44 分钟前
Spring Bean 生命周期
java·后端·spring
西安邮电大学1 小时前
分治算法详细讲解
java·后端·其他·算法·面试
老马聊技术1 小时前
AI对话功能之SpringBoot整合Vue3
vue.js·人工智能·spring boot·后端
甲维斯1 小时前
测一波Kimi K2.7,消耗一周配额!
前端·人工智能·游戏开发
Dick5071 小时前
ROS2 多机器人通用 Driver 层复盘:BaseRobotDriver 到多平台 Mock 切换实现
前端·javascript·机器人