如何把一个List转化成数组(深入解读toArray方法)

文章详细介绍了Java中List转Array的toArray方法的四种使用情况,包括无指定数组、指定数组容量足够、不足以及返回新数组的情况,并解析了源码来说明方法的工作原理。通过示例代码展示了如何在不同情况下正确使用toArray方法。

如何使用?

调用List的toArray方法就好,我们下面以List的子类 ArrayList为例进行转化

情况一

没有具体需要传到哪个数组里,你返回给我个数组就行。

	ArrayList<String> s = new ArrayList<>();
	s.add("123");
	s.add("456");
	String[] stringArray = s.toArray(new String[0]);
	System.out.println(Arrays.toString(stringArray));

输出结果:

[123, 456]

情况二

我有指定要返回的数组,你向他传入一个数组,那么最后他就会把ArrayList的对象s里的值一个个的放到你的数组里,多余的地方放null
但是!
你想想你要是传入的String数组,不够装这个ArrayList里的值怎么办?
为了不让你报错,java的开发者们早也想到,我们在情况三说

	ArrayList<String> s = new ArrayList<>();
	s.add("123");
	s.add("456");
	//你必须把结果给我装到strings里!!
	String[] strings = new String[10];
	s.toArray(strings);
	System.out.println("strings:"+ Arrays.toString(strings));

输出结果:

strings:[123, 456, null, null, null, null, null, null, null, null]

情况三

如果传入的字符串数组大小不足以接收ArrayList里的值怎么办?

	ArrayList<String> s = new ArrayList<>();
	s.add("123");
	s.add("456");
	//你必须把结果给我装到strings里!!
	String[] strings = new String[1];
	s.toArray(strings);
	System.out.println("strings:"+ Arrays.toString(strings));

输出结果:
这个输出结果也是意料之内的,ArrayList这个List的值不足以输入到你的数组里,所以干脆就不要放了,如何解决呢,我们情况四再说

strings:[null]

情况四

实际上toArray方法是有返回值的,就是返回一个数组,里面放着ArrayList里的每个值

    ArrayList<String> s = new ArrayList<>();
    s.add("123");
    s.add("456");
    //你必须把结果给我装到strings里!!
    String[] strings = new String[1];
    String[] stringssss = s.toArray(strings);
    System.out.println("strings:"+ Arrays.toString(strings));
    System.out.println("stringsssss:"+ Arrays.toString(stringssss));

输出结果

strings:[null]
stringsssss:[123, 456]

好啦,到这里你基本上就掌握了toArray方法的使用,可以熟练的应对各种情况了。想深入学习请看下面的源码讲解

源码分析

在情况一中

ArrayList<String> s = new ArrayList<>();
s.add("123");
s.add("456");
String[] stringArray = s.toArray(new String[0]);
System.out.println(Arrays.toString(stringArray));

你可能好奇为啥要传递一个new String[0]

这个对象即没有使用价值,你new一个String[0]这个字符串数组甚至没法使用,因为这个字符串数组长度为0。

让我们看看toArray的底层源码是怎么写的

    public <T> T[] toArray(T[] a) {
        if (a.length < size)
            // Make a new array of a's runtime type, but my contents:
            return (T[]) Arrays.copyOf(elementData, size, a.getClass());
        System.arraycopy(elementData, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    }
 

传入一个T类型的数组,即我们这里的String型的数组,先判断长度是否够,传入的数组a的长度不够即(a.length<size) size是指当前的ArrayList的大小,就会返回一个新的String[],并把ArrayList里的值进行拷贝,没有对你原来的数组进行处理,所以你原来的数组就为null啦~,对应情况三和情况四

同时这也就是为什么要传入一个new String[0]的原因,你不需要将结果写入某个你前面指定的数组,那么就给他一个空的数组,让程序自己判断就行,toArray方法会根据自己大小返回一个等长的数组。

那么如果不小于,即大于等于,那么就会调用System.arraycopy把你传入的数组,这就对应了情况二,并把你传入的数组返回,而不会额外的开辟空间创建数组。

再把源码粘贴一遍,方便你看

    public <T> T[] toArray(T[] a) {
        if (a.length < size)
            // Make a new array of a's runtime type, but my contents:
            return (T[]) Arrays.copyOf(elementData, size, a.getClass());
        System.arraycopy(elementData, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    }

如果你传入的数组大于ArrayList本身的长度的话,在填充之余,把其余的地方都变成null,并返回。

好啦,这就是toArray方法的源码解读。

感谢观看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值