如何使用?
调用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方法的源码解读。
感谢观看。