探秘 toArray ():让集合与数组转换不再神秘

目录

一、toArray 无参方法

二、toArray带参方法

2.1 入参分配的数组空间不够大

2.2 数组元素大于实际所需

2.3 总结


首先我们需要明确的是:在很多编程语言(比如 Java)中,有集合类(如 ArrayList、LinkedList 等),这些集合类通常会有一个叫做toArray的方法,并且有带参数的形式和无参数的形式。

一、toArray 无参方法

1. 如果使用 toArray() 的无参方法,返回结果只能为Object类型,强转为其他类型为报异常

案例演示:

public class Main {
    public static void main(String[] args) {
        List<Integer> ret=new ArrayList<>();
        ret.add(10);
        ret.add(20);
        ret.add(30);
        System.out.println("List的大小:"+ret.size());
        // 如果使用 toArray() 的无参方法,返回结果只能为Object类型,强转为其他类型为报异常
        Object[] array = ret.toArray();
        System.out.println("===========");
        System.out.println("正常转换后:"+array);
        for (Object o:array){
            System.out.println(o);
        }
        //Integer[] arr=(Integer)array;
        System.out.println("===========");
    }
}

二、toArray带参方法

这个带参数的toArray方法的主要作用是将集合中的元素转换为数组的形式,并且可以按照我们传入的数组类型来生成相应类型的数组。也就是说:使用 toArray(T[] a) 方法,可以指定返回类型,返回结果为指定类型的数组。

使用toArray带参方法,入参分配的数组空间不够大时,toArray方法内部将重新分配内存空间,并返回新数组地址;如果数组元素大于实际所需,下标为[ list.size() ]的数组元素将被置为null,其它数组元素保持原值,因此最好将方法入参数组大小定义与集合元素个数一致。

2.1 入参分配的数组空间不够大

假设我们有一个集合里面有若干个元素,比如有 5 个元素,现在我们调用toArray带参方法并且传入一个数组作为参数,但是这个传入的数组长度可能小于集合中元素的个数,比如我们只传入了一个长度为 3 的数组。
这时,toArray方法内部发现传入的数组空间不够容纳集合里所有的元素,它就会在方法内部自动重新分配一块足够大的内存空间来创建一个新的数组,这个新数组的长度能够正好容纳集合中的所有元素。然后把集合里的元素依次复制到这个新数组中,最后返回这个新数组的地址。也就是说,原来我们传入的那个数组因为空间不够用就被舍弃了,方法会返回一个全新的、能装下所有元素的数组。

通过代码及结果进行演示:

public class Test01 {
    public static void main(String[] args) {
        List<Integer> ret=new ArrayList<>();
        ret.add(10);
        ret.add(20);
        ret.add(30);
        System.out.println("List的大小:"+ret.size());
        //数组个数小于集合元素个数
        System.out.println("===========");
        System.out.println("数组个数小于集合元素个数的情况");
        Integer[] array1 = new Integer[1];
        Integer[] tmp = ret.toArray(array1);
        for (Integer num:array1){
            System.out.println("原数组:"+num);
        }
        System.out.println("新数组:"+tmp);
        }
    }
}

2.2 数组元素大于实际所需

反过来,如果我们传入的数组元素个数比集合实际的元素个数要多。比如集合里还是只有 5 个元素,但是我们传入了一个长度为 8 的数组作为toArray方法的参数。
那么在执行toArray方法后,它会把集合里的 5 个元素依次复制到这个传入的数组的前 5 个位置(下标从 0 到 4)。然后呢,对于下标为[ list.size() ]的这个数组元素(在这里list.size()就是集合的元素个数,也就是 5,所以就是下标为 5 的数组元素),会被置为null。而数组中剩下的其他元素(也就是下标从 6 到 7 的元素)会保持它们原来的值不变。

通过代码及结果进行演示:

public class Test01 {
    public static void main(String[] args) {
        List<Integer> ret=new ArrayList<>();
        ret.add(10);
        ret.add(20);
        ret.add(30);
        System.out.println("List的大小:"+ret.size());
        //数组个数小于集合元素个数
        System.out.println("===========");
        System.out.println("数组个数小于集合元素个数的情况");
        Integer[] array1 = new Integer[1];
        Integer[] tmp = ret.toArray(array1);
        for (Integer num:array1){
            System.out.println("原数组:"+num);
        }
        System.out.println("新数组:"+tmp);
        System.out.println("===========");
        System.out.println("数组个数大于集合元素个数的情况");
        Integer[] array2 = new Integer[5];
        ret.toArray(array2);
        for(Integer num:array2){
            System.out.println(num);
        }
    }
}

2.3 总结

我们推荐:使用集合转数组的方法,必须使用集合的toArray(T[] array),传入的是类型完全一样的数组,大小就是list.size()

public class Main {
    public static void main(String[] args) {
        List<Integer> ret=new ArrayList<>();
        ret.add(10);
        ret.add(20);
        ret.add(30);
        System.out.println("List的大小:"+ret.size());

        System.out.println("===========");
        // 使用 toArray(T[] a) 方法,可以指定返回类型,返回结果为指定类型的数组
        Integer[] arr=new Integer[ret.size()];
        ret.toArray(arr);
        for(Integer num : arr){
            System.out.println(num);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敖云岚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值