自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java中ArrayList、LinkedList、Vector、Stack的比較

開發(fā) 后端
在對ArrayList、LinkedList、Vector、Stack進行比較之前,我們先來對他們進行一個性能測試,結(jié)合源碼和測試結(jié)果來對ArrayList、LinkedList、Vector、Stack進行詳細的分析。

[[281488]]

 一、介紹

先回顧一下List的框架圖

 

JAVA中ArrayList、LinkedList、Vector、Stack的比較

 

由圖中的繼承關系,可以知道,ArrayList、LinkedList、Vector、Stack都是List的四個實現(xiàn)類。

AbstractList是一個抽象類,它繼承于AbstractCollection。AbstractList實現(xiàn)List接口中除size()、get(int location)之外的函數(shù)。

AbstractSequentialList 是一個抽象類,它繼承于AbstractList。AbstractSequentialList 實現(xiàn)了“鏈表中,根據(jù)index索引值操作鏈表的全部函數(shù)”。

ArrayList 是一個數(shù)組隊列,相當于動態(tài)數(shù)組。它由數(shù)組實現(xiàn),隨機訪問效率高,隨機插入、隨機刪除效率低。

LinkedList 是一個雙向鏈表。它也可以被當作堆棧、隊列或雙端隊列進行操作。LinkedList隨機訪問效率低,但隨機插入、隨機刪除效率低。

Vector 是矢量隊列,和ArrayList一樣,它也是一個動態(tài)數(shù)組,由數(shù)組實現(xiàn)。但是ArrayList是非線程安全的,而Vector是線程安全的。

Stack 是棧,它繼承于Vector。它的特性是:先進后出(FILO, First In Last Out)。

二、性能測試

在對ArrayList、LinkedList、Vector、Stack進行比較之前,我們先來對他們進行一個性能測試,結(jié)合源碼和測試結(jié)果來對ArrayList、LinkedList、Vector、Stack進行詳細的分析。

 

JAVA中ArrayList、LinkedList、Vector、Stack的比較

 

 

JAVA中ArrayList、LinkedList、Vector、Stack的比較

 

得到的結(jié)果如下

 

JAVA中ArrayList、LinkedList、Vector、Stack的比較

 

根據(jù)結(jié)果,可以很明顯的看出ArrayList、LinkedList、Vector、Stack的性能有很大的區(qū)別。

 

JAVA中ArrayList、LinkedList、Vector、Stack的比較

 

讀取:ArrayList > Vector > Stack > LinkedList

插入:LinkedList > Vector > ArrayList > Stack

刪除:LinkedList > Vector > ArrayList > Stack

三、插入的分析

LinkedList

 

JAVA中ArrayList、LinkedList、Vector、Stack的比較

 

從中,我們可以看出:通過add(int index, E element)向LinkedList插入元素時。先是在雙向鏈表中找到要插入節(jié)點的位置index;找到之后,再插入一個新節(jié)點。

雙向鏈表查找index位置的節(jié)點時,有一個加速動作:若index < 雙向鏈表長度的1/2,則從前向后查找; 否則,從后向前查找。

ArrayList

 

JAVA中ArrayList、LinkedList、Vector、Stack的比較

 

在這里面有一個非常耗時的操作

System.arraycopy(elementData, index, elementData, index + 1, size - index);

該方法被標記了native,調(diào)用了系統(tǒng)的C/C++代碼,在JDK中是看不到的,但在openJDK中可以看到其源碼。

該函數(shù)實際上最終調(diào)用了C語言的memmove()函數(shù),因此它可以保證同一個數(shù)組內(nèi)元素的正確復制和移動,比一般的復制方法的實現(xiàn)效率要高很多,很適合用來批量處理數(shù)組。Java強烈推薦在復制大量數(shù)組元素時用該方法,以取得更高的效率。

Vector

 

JAVA中ArrayList、LinkedList、Vector、Stack的比較

 

可以看到Vector和ArrayList是一樣的,都調(diào)用了System.arraycopy。由于Stack和繼承與Vector,就不仔細分析了。

四、查找的分析

LinkedList

 

JAVA中ArrayList、LinkedList、Vector、Stack的比較

 

從中,我們可以看出:通過get(int index)獲取LinkedList第index個元素時。先是在雙向鏈表中找到要index位置的元素;找到之后再返回。

雙向鏈表查找index位置的節(jié)點時,有一個加速動作:若index < 雙向鏈表長度的1/2,則從前向后查找; 否則,從后向前查找。

ArrayList

 

JAVA中ArrayList、LinkedList、Vector、Stack的比較

 

我們可以看到ArrayList直接返回數(shù)組中index位置的元素,而不需要像LinkedList一樣進行查找。

通過源碼發(fā)現(xiàn)Vector和Stack的操作方式和ArrayList一樣,這里就不詳細分析了。

五、刪除的分析

LinkedList

 

JAVA中ArrayList、LinkedList、Vector、Stack的比較

 

由于刪除了某一節(jié)點因此調(diào)整相應節(jié)點的前后指針信息,如下:

  1. e.previous.next = e.next;//預刪除節(jié)點的前一節(jié)點的后指針指向預刪除節(jié)點的后一個節(jié)點。  
  2. e.next.previous = e.previous;//預刪除節(jié)點的后一節(jié)點的前指針指向預刪除節(jié)點的前一個節(jié)點。 

清空預刪除節(jié)點:

  1. e.next = e.previous = null
  2. e.element = null

交給gc完成資源回收,刪除操作結(jié)束。

與ArrayList比較而言,LinkedList的刪除動作不需要“移動”很多數(shù)據(jù),從而效率更高。

ArrayList

 

JAVA中ArrayList、LinkedList、Vector、Stack的比較

 

恩,又是調(diào)用了System.arraycopy。

六、結(jié)論

操作ArrayListLinkedListVectorStack讀取O(1)O(n)O(1)O(1)插入O(n)O(1)O(n)O(n)刪除O(n)O(1)O(n)O(n)

ArrayList(實現(xiàn)動態(tài)數(shù)組),查詢快(隨意訪問或順序訪問),增刪慢。整體清空快,線程不同步(非線程安全)。數(shù)組長度是可變的百分之五十延長

LinkedList(實現(xiàn)鏈表),查詢慢,增刪快。

Vector(實現(xiàn)動態(tài)數(shù)組),都慢,被ArrayList替代。長度任意延長。線程安全(同步的類,函數(shù)都是synchronized)

Stack(實現(xiàn)堆棧)繼承于Vector,先進后出。

所以,快速訪問ArrayList,快速增刪LinkedList,單線程都可以用,多線程只能用同步類Vector

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2011-05-26 14:49:53

ArrayListLinkedList

2022-09-04 18:00:11

ArrayListVector

2024-10-05 00:00:15

ArrayList性能Java

2012-02-22 14:14:43

Java

2023-05-16 07:39:15

ArrayList磁盤IO

2021-10-12 16:46:59

ArrayList接口LinkedList

2018-09-29 15:34:34

JavaList接口

2021-07-08 10:00:59

LinkedLis集合定義

2021-10-09 20:13:03

ArrayListLinkedList java

2021-07-11 09:34:45

ArrayListLinkedList

2012-05-29 15:29:14

JavaArrayList

2009-06-12 09:12:27

VectorJava

2021-07-05 10:00:31

JavaStack基礎

2011-12-16 14:34:22

Java

2010-03-15 14:24:59

StackHeapJVM

2024-03-01 09:03:49

LinkedLisJavaList

2024-06-03 10:07:22

Vector類元素向量

2009-07-01 09:17:36

對象比較Java

2015-08-04 09:18:26

JavaArrayList元素

2015-03-25 11:42:52

Java刪除特定元素
點贊
收藏

51CTO技術棧公眾號