如何把一个List转化成数组(深入解读toArray方法)
2026/6/11 9:22:00 网站建设 项目流程

如何使用?

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

情况一

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

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

输出结果:

[123, 456]

情况二

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

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

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

strings:[null]

情况四

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

ArrayList<String>s=newArrayList<>();s.add("123");s.add("456");//你必须把结果给我装到strings里!!String[]strings=newString[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=newArrayList<>();s.add("123");s.add("456");String[]stringArray=s.toArray(newString[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;returna;}

传入一个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;returna;}

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

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

感谢观看。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询