Collection.toArray()

获取集合中所有元素组成的数组

定义

public Object[] toArray()

public <T> T[] toArray(T[] a)

参数

参数类型参数名称参数描述
T[]a如果数组足够大, 则存储集合元素的数组; 否则, 将为此目的分配相同运行时类型的新数组
类型参数E集合中的元素的类型
类型参数T包含了集合的数组元素的类型

返回值

返回一个数组, 该数组以适当的顺序(从第一个元素到最后一个元素)包含集合中的所有元素.

如果指定了数组参数, 且数组的长度大于集合的长度, 那么数组中不足的元素会用 null 填充.

抛出的异常

ArrayStoreException 如果指定数组的运行时类型不是集合中每个元素的运行时类型的超类

NullPointerException 如果指定的数组是null

说明

返回的数组将是 "安全的", 因为这个集合不会维护对它的引用. 也就是说, 这个方法分配出的是一个新的数组. 因此, 调用者可以自由地修改返回的数组.

此方法两种形式架起了基于数组的与基于集合的API的桥梁, 其中 toArray(T[] a) 方法允许精确控制输出数组的运行时类型, 并且在某些情况下, 可以用来节省分配成本.

 

注意事项

如果该集合保证其迭代器返回元素的顺序, 则 toArray(T[] a) 方法必须以相同的顺序返回元素.

示例

直接从集合获取数组的示例

package com.yi21.collection;

import java.util.Collection;
import java.util.List;

public class Yi21CollectionToArray {

    public static void main(String[] args) {
        
        List<String> aList = List.of("Hello", "World");
        System.out.println("aList 是否是一个集合? " + (aList instanceof Collection));

        Object[] arr = aList.toArray();
        System.out.println("获取拷贝数组元素的数量: " + arr.length + ", 并修改数组元素.");
        arr[1] = "21yi";
        System.out.println("输出数组元素:");
        for(Object a: arr) {
            System.out.println((String) a);
        }
        System.out.println("输出集合元素:");
        aList.forEach(System.out::println);

    }

}

执行结果为 :

aList 是否是一个集合? true
获取拷贝数组元素的数量: 2, 并修改数组元素.
输出数组元素:
Hello
21yi
输出集合元素:
Hello
World

提供数组参数从集合获取数组的示例

package com.yi21.collection;

import java.util.List;
import java.util.Collection;

public class Yi21CollectionToArray2 {

    public static void main(String[] args) {
        
        List<String> aList = List.of("Hello", "21yi");
        System.out.println("aList 是否是一个集合? " + (aList instanceof Collection));

        System.out.println("当指定数组容量大于原集合:");
        String[] arr = new String[3];
        arr = aList.toArray(arr);
        for(String a: arr) {
            System.out.println(a);
        }

        System.out.println("当指定数组容量小于原集合:");
        arr = new String[1];
        arr = aList.toArray(arr);
        for(String a: arr) {
            System.out.println(a);
        }

        System.out.println("修改数组的内容是否影响原集合:");
        arr[1] = "World";
        System.out.println("输出数组:");
        for(String a: arr) {
            System.out.println(a);
        }
        System.out.println("输出集合:");
        aList.forEach(System.out::println);

    }

}

执行结果为 :

aList 是否是一个集合? true
当指定数组容量大于原集合:
Hello
21yi
null
当指定数组容量小于原集合:
Hello
21yi
修改数组的内容是否影响原集合:
输出数组:
Hello
World
输出集合:
Hello
21yi