List接口經常使用實現類

ArrayList的實現:

  話很少說,直接看源碼:數組

 

 

   這句話是這樣描述的,它是List的實現類,而且是一個可變的數組。實現了List全部的操做,容許存放全部元素,包括空。除了實現List接口外,這個類還提供了操做數組大小的方法,意思集合的長度是能夠改變的。最後還提到了這個類和Vector相似,只是否是同步的。不少人都說ArrayList會給一個初始大小,咱們經過源碼來看看這樣的說法到底準確不,當咱們建立一個ArrayList的時候,咱們看看作了什麼:
緩存

 

 

 這裏將elementData賦值爲DEFAULTCAPACITY_EMPTY_ELEMENTDATA,繼續看看它們分別是什麼。安全

 

 

   看上面的註釋,重點是後面兩句話當添加第一個元素時,任何帶有elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA 的空ArrayList將擴展爲DEFAULT_CAPACITY。源碼分析

 

 

 

 

 

   從註釋的描述來看,咱們上面說的會有一個初始化的大小貌似沒有錯,而且大小爲10,可是註釋裏面描述的是將要擴展爲10,並無說在初始化的時候設置爲10,咱們看構造器裏面,只是將其設置爲了一個空的數組,因此並非在初始化的時候給它設置的初始長度。那麼到底何時設置的呢,咱們繼續來看,當建立好一個ArrayList對象以後,咱們確定要添加元素到該對象中,因此咱們來看add方法:spa

 

 

   進入ensureCapacityInternal方法,這裏傳了一個參數,size初始值爲0,因此至關於傳了一個1進去:線程

 

 

   再來看calculateCapacity方法,這個方法傳了兩個參數,一個是建立對象的時候設置的一個ArrayList的一個緩存集合,它如今是一個空數組,還有一個就是上面傳進來的1:3d

 

 

   這個方法邏輯很簡單,若是elementData爲空集合,即說明是第一次進行添加操做,咱們就比較傳進來的長度和默認的10,返回大的,因此這裏咱們也明白了傳進來的int數字其實就是自定義的集合長度值,只是這裏咱們沒有選擇自定義,因此默認是1.。若是不是第一次的話,則直接返回傳進來的長度。再來看ensureExplicitCapacity方法對象

 

 

   最終調用了grow方法,來看這個方法的實現:blog

 

 

 

 

  具體細節邏輯這裏就不詳細描述了,主要注意圈起來的兩個地方,能夠獲得ArrayList的擴容是每次擴容1.5倍,而具體擴容的原理是經過數組的複製實現的。接口

  根據上面的源碼分析,咱們能夠獲得以下結論:

  • ArrayList的底層是經過數組實現的。
  • ArrayList若是在初始化的時候沒有指定長度,那麼在使用的時候即調用add方法的時候會設置一個默認的長度10。
  • ArrayList裝滿的時候,程序會自動擴容,擴容至以前的1.5倍。
  • ArrayList和Vector十分相似,區別就在於ArrayList是線程不安全的,而Vector是線程安全的。

LinkedList的實現:

  老規矩,直接看類的註釋:

 

   從上面的描述能夠獲得LinkedList底層是經過雙向鏈表實現的,能夠保存空值,一樣它不是線程安全的。

LinkedList的源碼很是簡單,這裏就不介紹了。

Vector的實現:

  Vector實現和ArrayList基本上是一致的,惟一的區別就是它是線程安全的,因此效率相較於ArrayList低。

總結:

  ArrayList:實現了長度可變的數組,在內存中分配連續的空間。

  優勢:遍歷元素和隨機訪問元素的效率較高。

  缺點:添加和刪除須要大量移動元素,效率低,按照內容查找效率低。

  LinkedList:採用雙向鏈表存儲方式。

  優勢:插入、刪除元素效率較高。

  缺點:遍歷和隨機訪問元素效率較低。

相關文章
相關標籤/搜索