如何把一个List转化成数组(深入解读toArray方法)
如何使用调用List的toArray方法就好我们下面以List的子类 ArrayList为例进行转化情况一没有具体需要传到哪个数组里你返回给我个数组就行。ArrayListStringsnewArrayList();s.add(123);s.add(456);String[]stringArrays.toArray(newString[0]);System.out.println(Arrays.toString(stringArray));输出结果:[123, 456]情况二我有指定要返回的数组你向他传入一个数组那么最后他就会把ArrayList的对象s里的值一个个的放到你的数组里多余的地方放null但是你想想你要是传入的String数组不够装这个ArrayList里的值怎么办为了不让你报错java的开发者们早也想到我们在情况三说ArrayListStringsnewArrayList();s.add(123);s.add(456);//你必须把结果给我装到strings里String[]stringsnewString[10];s.toArray(strings);System.out.println(strings:Arrays.toString(strings));输出结果:strings:[123, 456, null, null, null, null, null, null, null, null]情况三如果传入的字符串数组大小不足以接收ArrayList里的值怎么办ArrayListStringsnewArrayList();s.add(123);s.add(456);//你必须把结果给我装到strings里String[]stringsnewString[1];s.toArray(strings);System.out.println(strings:Arrays.toString(strings));输出结果这个输出结果也是意料之内的ArrayList这个List的值不足以输入到你的数组里所以干脆就不要放了如何解决呢我们情况四再说strings:[null]情况四实际上toArray方法是有返回值的就是返回一个数组里面放着ArrayList里的每个值ArrayListStringsnewArrayList();s.add(123);s.add(456);//你必须把结果给我装到strings里String[]stringsnewString[1];String[]stringsssss.toArray(strings);System.out.println(strings:Arrays.toString(strings));System.out.println(stringsssss:Arrays.toString(stringssss));输出结果strings:[null] stringsssss:[123, 456]好啦到这里你基本上就掌握了toArray方法的使用可以熟练的应对各种情况了。想深入学习请看下面的源码讲解源码分析在情况一中ArrayListStringsnewArrayList();s.add(123);s.add(456);String[]stringArrays.toArray(newString[0]);System.out.println(Arrays.toString(stringArray));你可能好奇为啥要传递一个new String[0]这个对象即没有使用价值你new一个String[0]这个字符串数组甚至没法使用因为这个字符串数组长度为0。让我们看看toArray的底层源码是怎么写的publicTT[]toArray(T[]a){if(a.lengthsize)// Make a new array of as runtime type, but my contents:return(T[])Arrays.copyOf(elementData,size,a.getClass());System.arraycopy(elementData,0,a,0,size);if(a.lengthsize)a[size]null;returna;}传入一个T类型的数组即我们这里的String型的数组先判断长度是否够传入的数组a的长度不够即(a.lengthsize) size是指当前的ArrayList的大小就会返回一个新的String[]并把ArrayList里的值进行拷贝没有对你原来的数组进行处理所以你原来的数组就为null啦~对应情况三和情况四同时这也就是为什么要传入一个new String[0]的原因你不需要将结果写入某个你前面指定的数组那么就给他一个空的数组让程序自己判断就行toArray方法会根据自己大小返回一个等长的数组。那么如果不小于即大于等于那么就会调用System.arraycopy把你传入的数组这就对应了情况二并把你传入的数组返回而不会额外的开辟空间创建数组。再把源码粘贴一遍方便你看publicTT[]toArray(T[]a){if(a.lengthsize)// Make a new array of as runtime type, but my contents:return(T[])Arrays.copyOf(elementData,size,a.getClass());System.arraycopy(elementData,0,a,0,size);if(a.lengthsize)a[size]null;returna;}如果你传入的数组大于ArrayList本身的长度的话在填充之余把其余的地方都变成null并返回。好啦这就是toArray方法的源码解读。感谢观看。