List集合toArray方法和toArray(T[] a)方法

作用:将列表List中的元素导出为数组

toArray()

toArray()方法导出的是Object[]
返回的数组是一个新数组,多次运行toArray方法会生成多个数组对象(存储的引用地址是不同的),但是这些数组中的内容是一样的。
toArray返回的数组是安全的,可以对生成的数组做任意的修改。

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        Object[] objects1 = list.toArray();
        Object[] objects2 = list.toArray();
        System.out.println(objects1 == objects2); 
        // false 说明生成的数组对象是两个不同的,所以修改其中的一个数也不会影响另一个数组
    }

在这里插入图片描述

toArray(T[] a)

toArray(T[] a)方法导出的是指定类型的数组
toArray(T[] a)使用了泛型参数,可以返回指定类型数组,但是这个泛型在确定的时候必须是list中元素类型的父类或本身。
如果传递进去的参数是一个空数组,那么toArray(T[] a)和toArray()相同。

    List<String> list = new ArrayList<>();
    String[] y = list.toArray(new String[0]);

在这里插入图片描述
通过源码我们可以看到,如果传递进来的数组a空间大于list的话,就不会直接生成一个新数组来装list原来的元素对象,而是直接往a中填,并且将最后一个设置为null,这样设置的目的是为了toArray(T[] a)方法调用者从返回的数组中检测到null时就知道后面已经没有list元素对象了。

补充:
Arrays.copyOf(elementData, size);
  • 第一个参数是传入的元素数据,第二个参数是生成新的数组的长度。如果新数组的长度超过原有的数组的长度,则保留数组默认值。

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VZ7pRHFk-1628602606229)(evernotecid://4FA16892-2954-4FC8-B972-D19B62D8487E/appyinxiangcom/24422782/ENResource/p280)]@w=400

  • 用于复制指定的数组内容以达到扩容的目的,该方法对不同的基本数据类型都有对应的重载方法。

  • Array.copy方法返回的数组是新的数组对象,拷贝不会影响原来的数组。

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fcksyJaP-1628602606231)(evernotecid://4FA16892-2954-4FC8-B972-D19B62D8487E/appyinxiangcom/24422782/ENResource/p281)]@w=400

System.arraycopy(Object src,int srcPos, Object dest, int destPos,int length);
  • src:源对象,srcPos:源数组中的起始位置,dest:目标数组对象,destPos:目标数据中的起始位置,length:要拷贝的数组元素的数量。
总结
  • toArray()方法是直接调用Arrays.copyOf()方法,将list中的元素对象的引用装在一个新的生成的数组中。
  • toArray([] a)带有泛型,会返回指定泛型的数组对象,并且:如果a.length小于list元素个数,就直接调用copyOf()方法进行拷贝并且返回数组对象,新数组也是装list元素对象的引用。否则就先调用System.arrayCopy(),将list对象的引用装在a数组中,如果a数组还有剩余的空间,则将a[size]设置为null。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值