java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java toArray()

Java toArray() 方法 的使用

作者:Geoking.

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

一、toArray()方法简介

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

方法签名:

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

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

二、两种toArray()的区别

1. 无参toArray()

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;
}

👉 可以看出:

四、相关案例

示例 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() 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文