1. 程式人生 > >Array與ArrayList異同

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快很多!