LinkedList和ArrayList的區別、Vector和ArrayList的區別

ckxllf發表於2019-12-26

  LinkedList和ArrayList的區別

  繼承類和實現介面上來講

  他們都實現了List介面下的方法,他們都允許重複,允許null,並且有序的集合。

  LinkedList實現了Deque介面。

  底層實現上來講

  ArrayList底層用陣列來實現,LinkedList底層用雙連結串列來實現。

  那麼ArrayList的和LinkedList的對比就會退化為陣列和連結串列的區別。

  陣列隨機訪問一個元素的時間複雜度是O(1)。

  連結串列的隨機訪問一個元素的時間複雜度是O(n)。

  因為陣列的訪問只需要給定下標,就可以立馬訪問,而連結串列需要遍歷,遍歷的次數即為下標值。

  ArrayList 的 get() ,set()方法相對於LinkedList效率要高,ArrayList的查詢以及獲取元素,效率更高

  陣列隨機新增/刪除一個元素的時間複雜度是O(n)。

  連結串列隨機新增/刪除一個元素的時間複雜度是O(1)。

  因為陣列隨機新增一個元素,指定下標的元素以及後面的所有元素,都需要向後移動,開銷很大,而連結串列只需要將指定位置下標的上一個的節點確定,改變引用即可,開銷很小。

  (tips:在指定位置新增和刪除的時候,最壞情況是O(1/2 size),因為底層呼叫node()方法查詢的時候,先判斷索引和 1/2 size誰打誰小,如果索引小,那麼從前向後查詢,如果1/2size小,那麼從後向前查詢)

  LinkedList的add(),remove()方法,相對於ArrayList效率要高很多,LinkedList的刪除和新增元素,效率更高

  使用上來講

  當我們要使用集合來儲存的時候,我們應該考慮清楚,如果我們需要不斷的向集合中新增和刪除,那麼就使用LinkedList 鄭州人流手術多少錢

  如果更多的是不斷的獲取元素,那麼就使用ArrayList。

  Vector和ArrayList的區別

  簡單介紹一下Vector集合。

  Vector 繼承 自AbstractList,實現了List、Random、Colneable、java.io.Serializable介面,用陣列來實現。

  我們會發現Vector的繼承類和實現介面和ArrayList是一模一樣的。

  構造方法:

  無參構造器:Vector(){},初始化陣列,預設大小為10。

  雙參: Vector(int initialCapacity, int capacityIncrement)

  這兩個引數分別是,初始化大小和,增量,也就是指定了擴容方式。

  單參: Vector(int initialCapacity)

  底層呼叫雙參構造器,增量預設為0。

  Vector(Collection c) ,將集合新增到Vector中。

  擴容:grow()方法,如果需要增量沒有設定,預設兩倍擴容,如果設定了增量,那麼每一次擴容一個增量的大小。

  增刪改查的實現結構,與ArrayList沒有區別,但是方法都用了Synchronized 來修飾。也就是說Vector是執行緒安全的,當多執行緒訪問Vector時,不會引起各種各樣的錯誤。

  所以Vector和ArrayList的區別就是:

  Vector和ArrayList的底層實現一摸一樣,都是允許null,允許重複,有序的集合。

  Vector在構造器可以給定增量,也就是擴容的大小,如果不給定增量,那麼就2倍擴容,ArrayList預設1.5倍擴容。

  Vector執行緒安全,ArrayList非執行緒安全


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2670683/,如需轉載,請註明出處,否則將追究法律責任。

相關文章