深入理解ArrayList中 toArray(),toArray(T[])方法

在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


發現結果果然如此。






發佈了32 篇原創文章 · 獲贊 17 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章