Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android編程之ArrayList源碼詳解及使用

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

編輯:關於Android編程

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值的話,這麼寫沒問題。但如果確定不了的話,還是增加一個是否為空的判斷吧,避免空指針異常。


4、ArrayList的remove(Object o)方法,出入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在實際使用中的一些細節知識點,希望對大家能有所幫助。




  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved