真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

本篇內容介紹了“Java中ArrayList、LinkedList、Vector、Stack的對比”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

成都創(chuàng)新互聯(lián)公司自2013年起,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目成都做網(wǎng)站、成都網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元彝良做網(wǎng)站,已為上家服務,為彝良各地企業(yè)和個人服務,聯(lián)系電話:18980820575

 一、介紹

先回顧一下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進行比較之前,我們先來對他們進行一個性能測試,結合源碼和測試結果來對ArrayList、LinkedList、Vector、Stack進行詳細的分析。

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

得到的結果如下

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

根據(jù)結果,可以很明顯的看出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,調用了系統(tǒng)的C/C++代碼,在JDK中是看不到的,但在openJDK中可以看到其源碼。

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

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位置的節(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é)點因此調整相應節(jié)點的前后指針信息,如下:

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

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

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

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

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

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(實現(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

“Java中ArrayList、LinkedList、Vector、Stack的對比”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質量的實用文章!


分享標題:Java中ArrayList、LinkedList、Vector、Stack的對比
文章源于:http://weahome.cn/article/pcpdje.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部