Vector、ArrayList、LinkList集合框架的使用與理解

提及集合框架也是老生常談的話題,也是面試過程當中面試官高頻率問到的基礎知識,新人在學習集合框架的時候老是會常常混淆這些概念和各自特性,這裏簡單對經常使用的幾種集合作個簡單總結,若有疏漏請你們多多包涵。php

首先咱們來簡單瞭解一下Java的集合框架,如圖(圖片來自網絡):html

Collection接口是咱們集合框架根接口對象,Collection接口爲咱們定義了一系列數據集合操做,包括對集合元素的增長、刪除、插入和修改以及迭代等,他的實現子類包括:
vue

Known Indirect Subclasses


基本操做包括:java

  • add(Object o):增長元素
  • addAll(Collection c):...
  • clear():...
  • contains(Object o):是否包含指定元素
  • containsAll(Collection c):是否包含集合c中的全部元素
  • iterator():返回Iterator對象,用於遍歷集合中的元素
  • remove(Object o):移除元素
  • removeAll(Collection c):至關於減集合c
  • retainAll(Collection c):至關於求與c的交集
  • size():返回元素個數
  • toArray():把集合轉換爲一個數組

如上圖介紹:Collection接口類主要有三種實現類,Set集合、Queue集合以及最經常使用的List集合,這裏須要注意一下,Map不屬於Collection集合的實現類,後續會對Map集合框架進行詳解,這裏暫時跳過Map的介紹,android

由於咱們今天主要講解的是List集合,這裏爲了加深對集合框架的理解列出此圖,那麼相關Set集合和Queue以及Map集合你們能夠暫時先查找相關資料,這裏暫時跳過。c++

List接口的具體實現類包括LinkList、ArrayList、Vector以及Stack類,如今分別對他們的使用和特性作一個簡單的介紹、
es6

  1. Vector集合簡單介紹

咱們首先看看這張圖(以下),Vector類的繼承關係:
web

正如上圖,Vector繼承自AbstractList抽象集合類,並實現了Serializable(序列化接口)、Cloneable(對象克隆接口)、List<E>抽象接口,繼續追查AbstractList類咱們發現(下圖):面試

AbstractList抽象類實現了List接口,並繼承了AbstractCollection<E>類,npm

  • Known Direct Subclasses

如上Api介紹:AbstractList接口直接實現子類有ArrayList<E>和Vector<E>,間接實現子類包括LinkedList<E>和Stack<E>,咱們今天要講的這幾個集合類都是AbstractList<E>的實現子類,那麼回到正題,

Vector是List接口的實現類,支持全部的包括 adding, removing, and replacing elements在內的元素操做,底層基於數組Object[]的實現,Vector全部對元素的操做是同步的,經過加鎖的方式保證數據寫入的一致性,這是Vector與其餘list子類最大的區別,既然底層數據結構是數組,那麼咱們應該知道Vector具有數組索引快,增刪慢的特性,由於增刪都須要移動數組元素位置,而數組支持經過下標能夠快速索引元素,時間複雜度O(1),可是增刪一個元素時間複雜度爲O(n-1)n。

Vector支持4種構造方法:

第一種構造方法建立一個默認的向量,默認大小爲10:

Vector()複製代碼

第二種構造方法建立指定大小的向量。

Vector(int size)複製代碼

第三種構造方法建立指定大小的向量,而且增量用incr指定. 增量表示向量每次增長的元素數目。

Vector(int size,int incr)複製代碼

第四種構造方法建立一個包含集合c元素的向量:

Vector(Collection c)複製代碼

除了Collection接口定義方法外,Vector也定義了一些方法,具體請參考Api,這裏不詳細例舉。

   2.ArrayList集合介紹:

繼承關係我就不貼出來了,前面已經作了詳細的介紹,咱們單刀直入粗暴瞭解一下ArrayList一下,ArrayList的官方描述這樣說:ArrayList繼承自List接口,支持包括 adding, removing, and replacing elements等基於動態數組實現的集合結構,全部元素都支持,包括null。

這一點跟Vector很像,既然ArrayList底層也是基於數組實現的,那豈不是增刪查的性能開銷與Vector同樣咯,在某種程度上來講的確如此,他容許對元素進行快速訪問,可是這裏須要注意,ArrayList是線程不安全的,而Vector是線程安全的操做類,也就是說在單線程狀況下ArrayList決定是你的不二選擇,可是在多線程操做下咱們須要謹慎使用ArrayList集合類,避免多線程同時寫而引發的數據不一致性,但實現同步須要很高的花費,所以,訪問Vector比訪問ArrayList慢,Vector就是由於作了這層加鎖操做在使用效率上低於ArrayList性能。

除了性能開銷上兩者有差異,固然在其餘方面也有,例如擴容,默認的擴容因子不一樣,Vector默認擴展容量是原來的一倍,而ArrayList是原來的50%,具體實現請看Api.

固然ArrayList也有本身的方法,你們也能夠經過看看源碼ArrayList有那些實現方法以及構造函數之間的差異。

3. LinkedList集合介紹 :

一樣繼承關係也不貼出來,簡單粗暴的瞭解LinkedList集合,官方這樣描述的:LinkedList是List接口的實現類,支持包括增長、刪除、修改、查詢等操做在內的基於雙鏈表的實現類,容許操做全部元素對象包括null。

那麼LindedList集合與ArrayList、Vector集合有哪些不一樣?

咱們知道後二者是基於數組實現存儲的線性表結構,而LinedList底層是經過雙鏈表實現數據存儲相關操做,若是你們對鏈表不是很熟悉建議深刻學習一下,咱們知道鏈表對元素操做特性是遍歷慢,增刪快,不像數組基於下標的特性能夠快速訪問,只能從鏈表頭指針或尾指針進行遍歷操做,性能開銷比較大,可是基於鏈表這種指針特性,能夠快速進行元素增刪操做,並不須要內存中元素進行復制和移動,鏈表結構中元素是散列儲存的,而數組是線性排列的,故LinkedList很適合數據的動態插入和刪除,隨機訪問和遍歷速度則比較慢。

除了這些特性以外,另外,他還提供了List接口中沒有定義的方法,專門用於操做表頭和表尾元素,能夠看成堆棧、隊列和雙向隊列使用。具體方法和構造你們本身去查看Api。

4.Stack堆棧集合類:

Stack屬於Vector的子類,屬於堆棧集合類,屬於新增的集合類,官方描述是:Stack是一種後進先出(LIFO)數據結構,它表明了一組對象。它容許用戶從堆棧中彈出和推送,包括null對象。堆棧的大小沒有限制。

那麼既然知道它是堆棧結構,我相信你們應該對堆棧結構都瞭如指掌,這是咱們面向對象課程裏面很重要也是很基礎的知識,學過java的盆友都不會遺忘吧,若是真的記不清了要記得去補哦,

既然是堆棧結構,那麼它的方法確定包括pop()和 peek()吧,入棧和出戰是棧操做的最基本元素操做,固然除了這兩個你們熟知的方法還有其餘方法,具體也不例舉你們動手查一下。


那麼看到這兒今天的內容基本就結束了,最後作個小常規快速總結:

  1. ArrayList是最經常使用的List實現類,內部是經過數組實現的,它容許對元素進行快速隨機訪問。當數組大小不知足時須要增長存儲能力,就要講已經有數組的數據複製到新的存儲空間中。當從ArrayList的中間位置插入或者刪除元素時,須要對數組進行復制、移動、代價比較高。所以,它適合隨機查找和遍歷,不適合插入和刪除。
  2. Vector與ArrayList同樣,也是經過數組實現的,不一樣的是它支持線程的同步,即某一時刻只有一個線程可以寫Vector,避免多線程同時寫而引發的不一致性,但實現同步須要很高的花費,所以,訪問它比訪問ArrayList慢。
  3. LinkedList是用鏈表結構存儲數據的,很適合數據的動態插入和刪除,隨機訪問和遍歷速度比較慢。另外,他還提供了List接口中沒有定義的方法,專門用於操做表頭和表尾元素,能夠看成堆棧、隊列和雙向隊列使用。
  4. vector是線程(Thread)同步(Synchronized)的,因此它也是線程安全的,而Arraylist是線程異步(ASynchronized)的,是不安全的。若是不考慮到線程的安全因素,通常用Arraylist效率比較高。
  5. 若是集合中的元素的數目大於目前集合數組的長度時,vector增加率爲目前數組長度的100%,而arraylist增加率爲目前數組長度的50%.如過在集合中使用數據量比較大的數據,用vector有必定的優點。

  6. 若是查找一個指定位置的數據,vector和arraylist使用的時間是相同的,都是0(1),這個時候使用vector和arraylist均可以。而若是移動一個指定位置的數據花費的時間爲0(n-i)n爲總長度,這個時候就應該考慮到使用Linkedlist,由於它移動一個指定位置的數據
    所花費的時間爲0(1),而查詢一個指定位置的數據時花費的時間爲0(i)。
    ArrayList 和Vector是採用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增長和插入元素,都容許直接序號索引元素,可是插入數據要設計到數組元素移動 等內存操做,因此索引數據快插入數據慢,
    Vector因爲使用了synchronized方法(線程安全)因此性能上比ArrayList要差
    ,LinkedList使用雙向鏈表實現存儲,按序號索引數據須要進行向前或向後遍歷,可是插入數據時只須要記錄本項的先後項便可,因此插入數度較快!


最後:List集合元素是有序可重複的集合,這與後面咱們講到的set集合和map會有所不一樣,另外List接口也提供iterator()方法,咱們前面貼出來過,咱們能夠對集合元素進行迭代輸出,屬於很是使用高效的遍歷操做,固然你也能夠經過集合for循環或者數組遍歷等操做,集合與數組之間支持互相轉換,那麼內容到此結束,謝謝你們! 

期盼與你們一塊兒在技術的道路不斷成長,謝謝支持!

相關文章
相關標籤/搜索