Java toArray() 方法 的使用

 更新时间:2025年12月04日 09:36:40   作者:Geoking.  
toArray()是 Java 集合框架中定义在接口里的一个方法,用于将集合转换为数组,本文就来介绍一下Java toArray()方法的使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、toArray()方法简介

toArray() 是 Java 集合框架中定义在 java.util.Collection 接口里的一个方法,用于将集合转换为数组

方法签名:

// 无参版本
Object[] toArray();

// 泛型版本(推荐使用)
<T> T[] toArray(T[] a);

二、两种toArray()的区别

1. 无参toArray()

  • 返回一个 Object 类型数组
  • 需要强制类型转换才能使用具体类型
List<String> list = List.of("Java", "Python", "C++");
Object[] arr = list.toArray();

System.out.println(Arrays.toString(arr));
// 输出: [Java, Python, C++]

⚠️ 但是如果你想用 String[] 接收,手动转换:

String[] strArr = (String[]) list.toArray(); // 会报错 ❌

会抛出:

class [Ljava.lang.Object; cannot be cast to class [Ljava.lang.String; ([Ljava.lang.Object; and [Ljava.lang.String; are in module java.base of loader 'bootstrap')

原因:toArray() 返回的是 Object[],而不是 String[]。因为数组在运行时知道自己的具体类型,反过来不能转换

2. 带参数的toArray(T[] a)(推荐使用)

这个方法允许我们指定返回数组的类型,是更安全、类型友好的方式。

List<String> list = List.of("Java", "Python", "C++");
String[] arr = list.toArray(new String[0]);

System.out.println(Arrays.toString(arr));
// 输出: [Java, Python, C++]

推荐写法:

T[] array = list.toArray(new T[0]);

JDK 11 以后甚至可以这样写:

String[] arr = list.toArray(String[]::new);

这种方式使用了 方法引用(Method Reference),更加简洁高效。

三、toArray(T[] a)方法的内部机制

JDK 源码(简化版):

public <T> T[] toArray(T[] a) {
    if (a.length < size)
        // 如果传入数组太小,则创建一个新的同类型数组
        return (T[]) Arrays.copyOf(elementData, size, a.getClass());
    System.arraycopy(elementData, 0, a, 0, size);
    if (a.length > size)
        a[size] = null;
    return a;
}

👉 可以看出:

  • 若传入数组大小不够,会创建一个新的;
  • 若传入数组更大,则多余部分置为 null
  • 返回的数组类型与传入数组的类型一致。

四、相关案例

示例 1:List 转数组

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

// 推荐写法
Integer[] numArray = numbers.toArray(new Integer[0]);

System.out.println(Arrays.toString(numArray));
// 输出: [1, 2, 3, 4, 5]

示例 2:Set 转数组

Set<String> set = new HashSet<>(Arrays.asList("A", "B", "C"));
String[] arr = set.toArray(new String[0]);

System.out.println(Arrays.toString(arr));
// 输出: [A, B, C]

示例 3:使用方法引用(Java 11+)

List<String> list = List.of("Java", "Kotlin", "Scala");

// 使用方法引用创建新数组
String[] arr = list.toArray(String[]::new);

System.out.println(Arrays.toString(arr));
// 输出: [Java, Kotlin, Scala]

示例 4:数组大小影响演示

List<String> list = List.of("A", "B", "C");

// 数组大小刚好
String[] arr1 = list.toArray(new String[3]);
System.out.println(Arrays.toString(arr1)); // [A, B, C]

// 数组大小过小
String[] arr2 = list.toArray(new String[1]); // 会创建新数组
System.out.println(Arrays.toString(arr2)); // [A, B, C]

// 数组大小过大
String[] arr3 = list.toArray(new String[5]);
System.out.println(Arrays.toString(arr3)); // [A, B, C, null, null]

五、数组转集合(反向操作)

除了 toArray(),我们也常常需要把数组变成集合,可以使用:

String[] arr = {"A", "B", "C"};
List<String> list = Arrays.asList(arr);
System.out.println(list); // [A, B, C]

⚠️ 注意:
Arrays.asList() 返回的是一个定长列表,不能添加或删除元素。

如果需要可变集合:

List<String> list = new ArrayList<>(Arrays.asList(arr));
list.add("D"); // ✅

六、常见错误与注意事项 ⚠️

错误场景问题说明正确做法
(String[]) list.toArray()会抛出类型转换异常list.toArray(new String[0])
数组大小过小自动创建新数组✅ 安全
数组大小过大多余部分会置 null注意空指针判断
修改数组不影响集合二者是独立的toArray() 复制数据
Arrays.asList() 不可添加删除元素固定长度用 new ArrayList<>(...)

七、性能小贴士

  • 对于频繁转换的场景(尤其是大集合),建议使用:
list.toArray(new String[list.size()]);

避免额外的数组分配操作。

  • 对于小集合或不确定大小,推荐:
list.toArray(new String[0]);

更简洁、安全。

JVM 对 new T[0] 模式已有优化(JDK 11+ 性能与预分配数组几乎无差异)。

八、总结表

方法返回类型是否安全适用场景
toArray()Object[]否(需强转)快速调试或简单场景
toArray(T[] a)T[]✅ 是泛型集合转换
toArray(String[]::new)T[]✅ 推荐Java 11+ 优雅写法

到此这篇关于Java toArray() 方法 的使用的文章就介绍到这了,更多相关Java toArray() 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Maven本地打包war包实现代码解析

    Maven本地打包war包实现代码解析

    这篇文章主要介绍了Maven本地打包war包实现代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • java实现简易版图形界面计算器

    java实现简易版图形界面计算器

    这篇文章主要为大家详细介绍了java实现简易版图形界面计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • Java Web开发中的分页与参数校验举例详解

    Java Web开发中的分页与参数校验举例详解

    这篇文章主要介绍了JavaWeb开发中的分页设计和参数校验,分页设计通过分页查询参数优化查询性能,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-02-02
  • SpringBoot封装响应处理超详细讲解

    SpringBoot封装响应处理超详细讲解

    这篇文章主要介绍了SpringBoot封装响应处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12
  • springboot启动过程中常用的回调示例详解

    springboot启动过程中常用的回调示例详解

    springboot提供非常丰富回调接口,利用这些接口可以做非常多的事情,本文通过实例代码给大家介绍springboot启动过程中常用的回调知识感兴趣的朋友跟随小编一起看看吧
    2022-01-01
  • 在navicat中导入mysql数据库详细步骤(即.sql后缀的数据库)

    在navicat中导入mysql数据库详细步骤(即.sql后缀的数据库)

    Navicat是MySQL非常好用的可视化管理工具,功能非常强大,能满足我们日常数据库开发的所有需求,下面这篇文章主要给大家介绍了关于如何在navicat中导入mysql数据库(即.sql后缀的数据库)的相关资料,需要的朋友可以参考下
    2023-04-04
  • Java中for与foreach的区别

    Java中for与foreach的区别

    本文主要介绍了Java中for与foreach的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 使用MyBatisPlus自动生成代码后tomcat运行报错的问题及解决方法

    使用MyBatisPlus自动生成代码后tomcat运行报错的问题及解决方法

    这篇文章主要介绍了使用MyBatisPlus自动生成代码后tomcat运行报错的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • MyBatis SELECT基本查询实现方法详解

    MyBatis SELECT基本查询实现方法详解

    这篇文章主要介绍了MyBatis SELECT基本查询实现方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 浅析Spring boot 中 logback 配置<springProperty> 读取application.properties 中的属性

    浅析Spring boot 中 logback 配置<springPropert

    这篇文章主要介绍了浅析Spring boot 中 logback 配置<springProperty> 读取application.properties 中的属性,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02

最新评论