Android編程之ArrayList源碼詳解及使用

來源:互聯網
上載者:User

ArrayList 本是 java中的代碼,放到android這邊顯得不太合適,但由於它在android開發中又大量應用,所以就放到這裡,供大家學習。

相信大家對ArrayList不陌生,但要說到細節的方面,可能就有點含糊其辭了。下面就來說幾個日常使用中的幾個例子:


1、判斷ArrayList是否有值:

if (mList.size() != 0){    // do something}
上面這個寫法,是最常見的。但你知道嗎,ArrayList中其實是有個isEmpty()方法的,源碼如下:

    public boolean isEmpty() {        return size == 0;    }
所以,判斷ArrayList是否有值的寫法應改為:

if (!mList.isEmpty()){    // do something}

補充一點:最好再增加一個mList是否為空白的判斷,讓代碼的嚴謹性更好。


2、ArrayList 的add(E e)方法,可以傳入null的值嗎?

看了下面它的源碼,就有答案了:

    public boolean add(E e) {        ensureCapacity(size + 1);  // Increments modCount!!        elementData[size++] = e;        return true;    }
所以,答案是肯定的,可以傳入null。

補充一點:雖然ArrayList 是可以傳入null的,但在實際應用中,這麼做沒有什麼意義。所以,在調用add方法前,最好還是判斷一下傳入的值是否為空白。


3、ArrayList的get(int index)方法,會返回null嗎?

看一下它的源碼:

    public E get(int index) {        RangeCheck(index);        return (E) elementData[index];    }
這個的回答,還要看代碼是如何寫的。如果之前add的時候添加了null進去,那麼這裡就會有可能返回null。

很多人會這樣寫代碼:

for (int i = 0; i < mList.size(); i++) {    mList.get(i).xxx();}
如果能確定ArrayList中確實沒有null值的話,這麼寫沒問題。但如果確定不了的話,還是增加一個是否為空白的判斷吧,避免null 指標異常。


4、ArrayList的remove(Object o)方法,出入null時,會null 指標異常嗎?

實際應用當中,我相信沒人會直接傳個null進去。多數應用情境是,擷取了一個對象,在不知道其是否為null的情況下,想要移除掉它。

看一下它的源碼:

    public boolean remove(Object o) {        if (o == null) {            for (int index = 0; index < size; index++)                if (elementData[index] == null) {                    fastRemove(index);                    return true;                }        } else {            for (int index = 0; index < size; index++)            if (o.equals(elementData[index])) {                fastRemove(index);                return true;            }        }        return false;    }
所以,傳入為null的值的話,如果我們之前調用add方法時,傳入過null值,那麼這裡就會移除掉它。


5、ArrayList的remove(Object o)方法傳入未添加的值,會報異常嗎?

如果我們傳入的值,之前沒有add過,也只是返回false,並不會報什麼異常。原因就在上面那段代碼裡。

而在實際代碼中,有些人在調用remove方法時,會這麼寫:

if(mList.contain(object)){    mList.remove(object);}
所以,這麼看來,remove方法前再調用contain,就沒什麼意義了。我們可以通過判斷其返回值,來獲得其是否有這個值,也就是是否刪除成功。


6、ArrayList可以重複添加相同的值嗎?

這個問題其實比較基礎了,但實際寫代碼中,還會有很多人在這塊犯錯誤,認為相同對象只能添加一次。

這裡直接給出答案:相同的對象是可以重複添加進去的。原因可以從上面add方法瞭解到。

補充一點:可以添加多個相同對象,但remove的時候,可不會一次全部都刪掉,而是按添加順序刪除。調一次,刪除一個!這一點,初學java的同學要特別注意了!


7、ArrayList中的Object[ ] toArray() 與 T[ ] toArray(T[ ] a) 方法

在實際應用情境中,會需要將ArrayList轉換成數組的形式。我見過有些人會用for迴圈的方法,一個個將ArrayList取出來,再賦值給數組的。沒那麼麻煩,用toArray這個方法即可。但ArrayList會有兩個同名方法,該用哪一個呢?還是先看源碼吧:

    public Object[] toArray() {        return Arrays.copyOf(elementData, size);    }    public  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;    }
直接調用toArray()這個方法,會直接返回一個數組,源碼是返回Object類型的。所以,你需要自己手動泛型一下。

說起這個泛型,還真得嘮叨一句,不知道有多少人會這麼寫:

ArrayList mList = new ArrayList();......String[] s = (String[]) mList.toArray();
如果有哪位同學這麼寫運行不報錯的話,給我留個言。


繼續。下面那個toArray(T[] a),就顯得稍微複雜了一些。如果T[]的大小比ArrayList要小的話,則只會返回與T[]大小相等的數組。

注意,如果傳入的數組與ArrayList的大小不相等,則會將ArrayList的size那位賦值為null。

這裡給個最簡單的測試例子:

ArrayList mList = new ArrayList();mList.add("a");mList.add("b");String[] s = new String[4];s[2] = "c";s[3] = "d";for (String string: s) {    System.out.println(string);}s = mList.toArray(s);for (String string : s) {    System.out.println(string);}
第一個for迴圈輸出內容為:

null
null
c
d

因為我沒有對String數組第一個和第二個賦值,所以自然為輸出內容為null。


第二個for迴圈輸出內容為:

a
b
null
d

可以看到,String數組的第三個值被賦值為null。


所以,在使用toArray(T[] a)要特別留心這個問題。當然,如果對第一個toArray()使用覺得麻煩的話,可以建立一個與ArrayList大小一樣的數組,調用toArray(T[] a)傳參進去,就可以直接得到了:

ArrayList mList = new ArrayList();......String[] s = new String[mList.size()];s = mList.toArray(s);


以上,就是總結了ArrayList在實際使用中的一些細節知識點,希望對大家能有所協助。




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.