編輯:關於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() 與
在實際應用場景中,會需要將ArrayList轉換成數組的形式。我見過有些人會用for循環的方法,一個個將ArrayList取出來,再賦值給數組的。沒那麼麻煩,用toArray這個方法即可。但ArrayList會有兩個同名方法,該用哪一個呢?還是先看源碼吧:
public Object[] toArray() { return Arrays.copyOf(elementData, size); } public直接調用toArray()這個方法,會直接返回一個數組,源碼是返回Object類型的。所以,你需要自己手動泛型一下。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; }
說起這個泛型,還真得唠叨一句,不知道有多少人會這麼寫:
ArrayList如果有哪位同學這麼寫運行不報錯的話,給我留個言。mList = new ArrayList (); ...... String[] s = (String[]) mList.toArray();
繼續。下面那個toArray(T[] a),就顯得稍微復雜了一些。如果T[]的大小比ArrayList要小的話,則只會返回與T[]大小相等的數組。
注意,如果傳入的數組與ArrayList的大小不相等,則會將ArrayList的size那位賦值為null。
這裡給個最簡單的測試例子:
ArrayList第一個for循環輸出內容為: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); }
null
null
c
d
因為我沒有對String數組第一個和第二個賦值,所以自然為輸出內容為null。
第二個for循環輸出內容為:
a
b
null
d
可以看到,String數組的第三個值被賦值為null。
所以,在使用toArray(T[] a)要特別留心這個問題。當然,如果對第一個toArray()使用覺得麻煩的話,可以創建一個與ArrayList大小一樣的數組,調用toArray(T[] a)傳參進去,就可以直接得到了:
ArrayListmList = new ArrayList (); ...... String[] s = new String[mList.size()]; s = mList.toArray(s);
以上,就是總結了ArrayList在實際使用中的一些細節知識點,希望對大家能有所幫助。
轉載請注明出處 http://blog.csdn.net/typename/ powered by miechal zhao : miechalzhao@gmail.
從系統相冊中選擇照片或則調用系統相機。大部分的項目都會用到,我進行了一下封裝,仿ios的效果。效果如下:1、Camera的基類package com.zhang.test
1 直接上圖2 原理原理很簡單,就是把相應的倒計時邏輯等封裝到一個控件中,並向外部提供接口。3 代碼 import java.util.Timer;import
Android Studio,自Google2013年發布以來,就倍受Android開發者的喜愛,我們本書,就是基於Android Studio來進行案例演示的,大家都