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

被折叠的 条评论
为什么被折叠?



