在List類的具體實現類 ArrayList類中,有一個toArray()方法,該方法的作用是將ArrayList類型的對象轉換爲數組。
該類型有兩個方法:1.toArray() 和 2. toArray(T[])
先來看一下源碼:
public Object[] toArray() {
return Arrays.copyOf(this.elementData, this.size);
}
首先,返回值變成了Object[]類型,而toArray()的實質是調用了Arrays.copyof()方法。
由於是用的idea的反編譯,所以,參數類型顯示的是var變量值,但是,這個不影響我們閱讀簡單的代碼。
public static <T> T[] copyOf(T[] var0, int var1) {
return (Object[])copyOf(var0, var1, var0.getClass());
}
public static <T, U> T[] copyOf(U[] var0, int var1, Class<? extends T[]> var2) {
Object[] var3 = var2 == Object[].class?(Object[])(new Object[var1]):(Object[])((Object[])Array.newInstance(var2.getComponentType(), var1));
System.arraycopy(var0, 0, var3, 0, Math.min(var0.length, var1));
return var3;
}
到這個我們發現了,這麼一行代碼:
Object[] var3 = var2 == Object[].class?(Object[])(new Object[var1]):(Object[])((Object[])Array.newInstance(var2.getComponentType(), var1));
這就是ArrayList.toArray()方法的實質。
如果我們ArrayList容器中元素的類型是Object[]類型,那麼就new一個Object的數組,然後調用
System.arraycopy
把ArrayList對象中的元素依次複製進入新的數組,然後新數組。
下面看一下ArrayList(T[]var1)這個方法,其實這纔是關鍵
public <T> T[] toArray(T[] var1) {
if(var1.length < this.size) {
return (Object[])Arrays.copyOf(this.elementData, this.size, var1.getClass());
} else {
System.arraycopy(this.elementData, 0, var1, 0, this.size);
if(var1.length > this.size) {
var1[this.size] = null;
}
return var1;
}
}
我們看到了,其內部實現,是將ArryList列表的長度和我們提供的數組var1的長度進行比較,如果:
1.ArrayList列表長度更長,那麼就調用Arrays.copyOf()方法,和上面一樣,生成新的數組,然後依次將元素複製過去。
2.如果var1數組的長度更長,那就好辦了,直接使用var1數組進行一個元素複製的操作,那麼,var1數組更長的部分怎麼辦呢?
僅僅是將ListArray對象長度的末尾置爲了null,然後後面的就不管了。
var1[this.size] = null;
我們可以寫一個例子測試一下toArray(T[]var1)方法:
String[]var1 = new String[3];
var1[0] ="0";
var1[1] = "1";
var1[2] = "2";
System.out.println("var1 的地址 :" + var1);
List<String> ll= new ArrayList<String>();
ll.add("zzz");
System.out.println("複製後的地址 :" + ll.toArray(var1));
for(String i : var1){
System.out.println(i);
我們的var1[]數組長度爲3,而定義的ArrayList列表st長度爲1.
現在將st列表複製進入var數組,我們預計的結果是,複製後的地址和原來var1的地址是一樣的,並且var1中第一個元素被換成了"zzz",第二個元素變成了null,第三個元素不變
下面看一下結果:
var1 的地址 :[Ljava.lang.String;@74a14482
複製後的地址 :[Ljava.lang.String;@74a14482
zzz
null
2
發現結果果然如此。