1. 程式人生 > >關於Java中List三個實現類區別

關於Java中List三個實現類區別

1. 前言:

List實現Collection介面,它的資料結構是有序可以重複的結合,該結合的體系有索引;它有三個實現類:ArrayList、LinkList、Vector三個實現類。

2. 三個實現類的基本區別:

2.1 ArrayList:

底層資料結構使陣列結構,查詢速度快,增刪改慢,

2.2 LinkList:

底層使用連結串列結構,增刪速度快,查詢稍慢;

2.3 Vector:

底層是陣列結構,Vector是執行緒同步的,所以它也是執行緒安全的。而ArratList是執行緒非同步的,不安全。如果不考慮安全因素,一般用Arralist效率比較高;

可變長度陣列不斷new陣列: (1) ArrayList當初始化容量超過10時,會new一個50%de ,把原來的東西放入這150%中; (2) Vector:當容量超過10時,會new一個100%的浪費記憶體;

3. ArrayList

3.1 ArrayList 概述:

① ArrayList是List介面的可變陣列的實現。實現了所有可選列表操作,並允許包括 null 在內的所有元素。除了實現 List 介面外,此類還提供一些方法來操作內部用來儲存列表的陣列的大小。

② 每個ArrayList例項都有一個容量,該容量是指用來儲存列表元素的陣列的大小。它總是至少等於列表的大小。隨著向ArrayList中不斷新增元素,其容量也自動增長。自動增長會帶來資料向新陣列的重新拷貝,因此,如果可預知資料量的多少,可在構造ArrayList時指定其容量。在新增大量元素前,應用程式也可以使用ensureCapacity操作來增加ArrayList例項的容量,這可以減少遞增式再分配的數量。

③ 注意,此實現不是同步的。如果多個執行緒同時訪問一個ArrayList例項,而其中至少一個執行緒從結構上修改了列表,那麼它必須保持外部同步。

3.2 ArrayList的實現:

對於ArrayList而言,它實現List介面、底層使用陣列儲存所有元素。其操作基本上是對陣列的操作。下面我們來分析ArrayList的原始碼:底層使用陣列實現

Java程式碼 private transient Object[] elementData;

構造方法: ArrayList提供了三種方式的構造器,可以構造一個預設初始容量為10的空列表、構造一個指定初始容量的空列表以及構造一個包含指定collection的元素的列表,這些元素按照該collection的迭代器返回它們的順序排列的。

4.1 LinkList的概述:

LinkedList的本質是雙向連結串列。

(01) LinkedList繼承於AbstractSequentialList,並且實現了Dequeue介面。 (02) LinkedList包含兩個重要的成員:header 和 size。header是雙向連結串列的表頭,它是雙向連結串列節點所對應的類Entry的例項。Entry中包含成員變數: previous, next, element。其中,previous是該節點的上一個節點,next是該節點的下一個節點,element是該節點所包含的值。size是雙向連結串列中節點的個數。

4.2 LinkList的實現:

LinkedList實際上是通過雙向連結串列去實現的。既然是雙向連結串列,那麼它的順序訪問會非常高效,而隨機訪問效率比較低。

既然LinkedList是通過雙向連結串列的,但是它也實現了List介面{也就是說,它實現了get(int location)、remove(intlocation)等“根據索引值來獲取、刪除節點的函式”}。LinkedList是如何實現List的這些介面的,如何將“雙向連結串列和索引值聯絡起來的”?

實際原理非常簡單,它就是通過一個計數索引值來實現的。例如,當我們呼叫get(int location)時,首先會比較“location”和“雙向連結串列長度的1/2”;若前者大,則從連結串列頭開始往後查詢,直到location位置;否則,從連結串列末尾開始先前查詢,直到location位置。

5. Vector

相對於ArrayList來說,Vector執行緒是安全的,也就是說是同步的 建立了一個向量類的物件後,可以往其中隨意地插入不同的類的物件,既不需顧及型別也不需預先選定向量的容量,並可方便地進行查詢。對於預先不知或不願預先定義陣列大小,並需頻繁進行查詢、插入和刪除工作的情況,可以考慮使用向量類。向量類提供了三種構造方法:

public vector()
public vector(intinitialcapacity,int capacityIncrement)
public vector(intinitialcapacity)

使用第一種方法,系統會自動對向量物件進行管理。若使用後兩種方法,則系統將根據引數initialcapacity設定向量物件的容量(即向量物件可儲存資料的大小),當真正存放的資料個數超過容量時,系統會擴充向量物件的儲存容量。 引數capacityIncrement給定了每次擴充的擴充值。當capacityIncrement為0時,則每次擴充一倍。利用這個功能可以優化儲存。

--------------------- 作者:ink4t 來源:CSDN 原文:https://blog.csdn.net/Ink4T/article/details/77345830?utm_source=copy