Array與ArrayList異同
本文是作者在專案過程中做的總結,內容既有借鑑其他大神的地方,也有自己的一點小小思考。若有錯誤的地方,歡迎指正!
參考來源1:https://www.cnblogs.com/skywang12345/p/3308556.html
參考來源2:https://www.cnblogs.com/kungfupanda/p/7357142.html
1.Array
陣列宣告時就要初始化並給定長度,長度不可變,並且只能儲存同一型別的資料,比如:宣告一個int陣列,那麼只能存取int正數。陣列容量固定,但比arrayList高效。因此,能用array就不用arrayList。
2.ArrayList
arrayList相當於動態的陣列,既有陣列的特徵,也有連結串列的特徵。除了能夠實現快速隨機訪問以外,還能像連結串列一樣對集合元素進行快速的插入和刪除。
和Vector不同,ArrayList中的操作不是執行緒安全的!所以,建議在單執行緒中才使用ArrayList,而在多執行緒中可以選擇Vector或者CopyOnWriteArrayList。
ArrayList 實際上是通過一個數組去儲存資料的。當我們構造ArrayList時;若使用預設建構函式則ArrayList的預設容量大小是10
當ArrayList容量不足以容納全部元素時,ArrayList會重新設定容量:新的容量=“(原始容量x3)/2 + 1”
JDK1.6 int newCapacity = (oldCapacity * 3)/2 + 1;
JDK1.8 int newCapacity = oldCapacity + (oldCapacity >> 1);
已經不是1.5倍加1了,而是1.5倍,個人覺得這是根據CPU計算能力特性對JAVA效能的優化。
ArrayList實現java.io.Serializable的方式。當寫入到輸出流時,先寫入“容量”,再依次寫入“每一個元素”;當讀出輸入流時,先讀取“容量”,再依次讀取“每一個元素”。
3.ArrayList方法總結
1.增加元素
boolean add(Element e)
增加指定元素到連結串列尾部.
void add(int index, Element e)
增加指定元素到連結串列指定位置.
boolean addAll(Collection<? extends E> c)
將集合c追加到ArrayList中
boolean addAll(int index, Collection<? extends E> c)
從index位置開始,將集合c新增到ArrayList
2.刪除元素
E remove(int index)
刪除ArrayList的指定位置元素
boolean remove(Object o)
刪除ArrayList的指定元素
void fastRemove(int index)
快速刪除第index個元素
void removeRange(int fromIndex, int toIndex)
刪除fromIndex到toIndex之間的全部元素
void clear()
刪除所有元素
3.修改元素
E set(int index, E element)
將連結串列中指定位置上的元素替換成新元素
4.查詢元素
E get(int index)
獲取連結串列中指定位置處的元素.
boolean contains(Object o)
如果連結串列包含指定元素,返回true
int indexOf(Object o)
返回元素在連結串列中第一次出現的位置,如果返回-1,表示連結串列中沒有這個元素
int lastIndexOf(Object o)
返回元素在連結串列中最後一次出現的位置,如果返回-1,表示連結串列中沒有這個元素
4.什麼時候用array?什麼時候使用arrayList?
可以參考以下幾種情況:
1.是否確定/已知資料集合的元素個數
2.是否儲存同一型別的資料(arrayList不加泛型時可實現儲存不同型別的資料)
3.是否需要快捷地在任何位置單個/批量插入資料
4.是否需要快捷地單個/批量刪除資料
5.涉及到基礎資料型別時,儘量用array,因為int運算比INTEGER快很多!