ArrayList源码学习之toArray方法
2018-03-16 本文已影响0人
zsdvvb
先看一个无参数版的实现
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}
这个没什么特别的,直接调用Arrays的copyOf方法返回了一个ArrayList内部elementsData数组的复制数组。
再看下面这个重载方法
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对象数组a,如果传入数组的长度小于arraylist的size,直接返回一个elementsData的复制数组,并已经完成了强制类型转换,如果数组a长度大于arrayList的size,并不改变a的length,而是直接将对应大小的数组copy到a中,然后直接简单粗暴的令a[size]=null。。。
测试如下:
public static void main(String[] args) {
ArrayList<Integer> a = new ArrayList<Integer>();
a.add(10);
a.add(11);
a.add(12);
Integer[] array = new Integer[] {1,2,3,4,5,6,7} ;
array = a.toArray(array);
for(Integer i : array) {
System.out.println(i);
}
}
输出
10
11
12
null
5
6
7