日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

一、介紹

先回顧一下List的框架圖

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

 

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

  • AbstractList是一個抽象類,它繼承于AbstractCollection。AbstractList實現List接口中除size()、get(int location)之外的函數。
  • AbstractSequentialList 是一個抽象類,它繼承于AbstractList。AbstractSequentialList 實現了“鏈表中,根據index索引值操作鏈表的全部函數”。
  • ArrayList 是一個數組隊列,相當于動態數組。它由數組實現,隨機訪問效率高,隨機插入、隨機刪除效率低。
  • LinkedList 是一個雙向鏈表。它也可以被當作堆棧、隊列或雙端隊列進行操作。LinkedList隨機訪問效率低,但隨機插入、隨機刪除效率低。
  • Vector 是矢量隊列,和ArrayList一樣,它也是一個動態數組,由數組實現。但是ArrayList是非線程安全的,而Vector是線程安全的。
  • Stack 是棧,它繼承于Vector。它的特性是:先進后出(FILO, First In Last Out)。

二、性能測試

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

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

 


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

 

得到的結果如下

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

 

根據結果,可以很明顯的看出ArrayList、LinkedList、Vector、Stack的性能有很大的區別。

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插入元素時。先是在雙向鏈表中找到要插入節點的位置index;找到之后,再插入一個新節點。

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

ArrayList

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

 

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

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

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

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

Vector

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

 

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

四、查找的分析

LinkedList

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

 

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

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

ArrayList

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

 

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

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

五、刪除的分析

LinkedList

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

 

由于刪除了某一節點因此調整相應節點的前后指針信息,如下:

e.previous.next = e.next;//預刪除節點的前一節點的后指針指向預刪除節點的后一個節點。 
e.next.previous = e.previous;//預刪除節點的后一節點的前指針指向預刪除節點的前一個節點。 

清空預刪除節點:

e.next = e.previous = null;
e.element = null;

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

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

ArrayList

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

 

恩,又是調用了System.arraycopy。

六、結論

操作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(實現動態數組),查詢快(隨意訪問或順序訪問),增刪慢。整體清空快,線程不同步(非線程安全)。數組長度是可變的百分之五十延長
  • LinkedList(實現鏈表),查詢慢,增刪快。
  • Vector(實現動態數組),都慢,被ArrayList替代。長度任意延長。線程安全(同步的類,函數都是synchronized)
  • Stack(實現堆棧)繼承于Vector,先進后出。

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

分享到:
標簽:JAVA
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定