1. 程式人生 > >Java中Array、List、ArrayList的區別

Java中Array、List、ArrayList的區別

Array

Array(陣列)是基於索引(index)的資料結構,它使用索引在陣列中搜索和讀取資料是很快的。

Array獲取資料的時間複雜度是O(1),但是要刪除資料卻是開銷很大,因為這需要重排陣列中的所有資料。

List

List—是一個有序的集合,可以包含重複的元素,提供了按索引訪問的方式,它繼承Collection。

List是一個介面,不能寫成如下:

List<Integer> list = new List<Integer>();//錯誤

List有兩個重要的實現類:ArrayList和LinkedList

ArrayList

繼承關係

這裡寫圖片描述

可以看作是能夠自動增長容量的陣列;

利用ArrayList的toArray返回一個數組;

Arrays.asList返回一個列表;

  1. ArrayList底層採用陣列實現,當使用不帶引數的構造方法生成ArrayList物件時,實際上會在底層生成一個長度為10的Object型別的陣列。
  2. 如果增加的元素個數超過10個,那麼ArrayList底層會生成一個新的陣列,長度為原陣列的1.5倍+1,然後將原陣列的內容複製到新陣列中,並且後續增加的內容都會放到新的陣列當中,當新的陣列無法容納增加的元素時,重讀該過程。
  3. 對於ArrayList元素的刪除操作,需要將被刪除元素的後續元素向前移動,代價比較大。
  4. 集合當中只能放置物件的引用,無法放置原生資料型別,我們必須使用原生資料的包裝類才能加入到集合當中。
  5. 集合當中都是Object型別,因此取出來的也是Object型別,那麼必須要使用強制型別轉化將其轉換成真正的型別(放置進去的型別)。

LinkedList

是一個雙鏈表,在新增和刪除元素時具有比ArrayList更好的效能.但在get與set方面弱於ArrayList.當然,這些對比都是指資料量很大或者操作很頻繁。

  1. 相對於ArrayList,LinkedList插入是更快的。因為LinkedList不像ArrayList一樣,不需要改變陣列的大小,也不需要在陣列裝滿的時候要將所有的資料重新裝入一個新的陣列,這是ArrayList最壞的一種情況,時間複雜度是O(n),而LinkedList中
  2. 插入或刪除的時間複雜度僅為O(1)。ArrayList在插入資料時還需要更新索引(除了插入陣列的尾部)。
  3. 類似於插入資料,刪除資料時,LinkedList也優於ArrayList。
  4. LinkedList需要更多的記憶體,因為ArrayList的每個索引的位置是實際的資料,而LinkedList中的每個節點中儲存的是實際的資料和前後節點的位置。