深入淺析ArrayList 和 LinkedList的執(zhí)行效率比較
一、概念:
一般我們都知道ArrayList* 由一個(gè)數(shù)組后推得到的 List。作為一個(gè)常規(guī)用途的對(duì)象容器使用,用于替換原先的 Vector。允許我們快速訪問元素,但在從列表中部插入和刪除元素時(shí),速度卻嫌稍慢。一般只應(yīng)該用ListIterator 對(duì)一個(gè) ArrayList 進(jìn)行向前和向后遍歷,不要用它刪除和插入元素;與 LinkedList 相比,它的效率要低許多LinkedList 提供優(yōu)化的順序訪問性能,同時(shí)可以高效率地在列表中部進(jìn)行插入和刪除操作。但在進(jìn)行隨機(jī)訪問時(shí),速度卻相當(dāng)慢,此時(shí)應(yīng)換用 ArrayList。
二、測(cè)試
本來自己寫了一些測(cè)試類想測(cè)試下ArrayList和LinkedList的性能比較,發(fā)現(xiàn)怎么寫都差強(qiáng)人意,今天在《Thinking in Java》中看到了這樣的一段代碼,個(gè)人覺得寫得不賴。
public class ListPerformance { private static final int REPS = 100; private abstract static class Tester//內(nèi)部抽象類,作為L(zhǎng)ist測(cè)試。 { String name; int size; Tester(String name, int size) { this.name = name; this.size = size; } abstract void test(List a); } private static Tester[] tests = {new Tester("get", 300)//一個(gè)測(cè)試數(shù)組,存儲(chǔ)get(隨機(jī)取)、iteration(順序遍歷)、insert(中間插入)、remove(隨機(jī)刪除) { void test(List a) { for (int i = 0; i < REPS; i++) { for (int j = 0; j < a.size(); j++) { a.get(j); } } } }, new Tester("iteration", 300) { void test(List a) { for (int i = 0; i < REPS; i++) { Iterator it = a.iterator(); while (it.hasNext()) it.next(); } } }, new Tester("insert", 1000) { void test(List a) { int half = a.size() / 2; String s = "test"; ListIterator it = a.listIterator(half); for (int i = 0; i < size * 10; i++) { it.add(s); } } }, new Tester("remove", 5000) { void test(List a) { ListIterator it = a.listIterator(3); while (it.hasNext()) { it.next(); it.remove(); } } }, }; public static void test(List a) { System.out.println("Testing " + a.getClass().getName());//輸出測(cè)試的類名稱 for (int i = 0; i < tests.length; i++) { fill(a, tests[i].size);//填充空集合 System.out.print(tests[i].name); long t1 = System.currentTimeMillis(); tests[i].test(a);//進(jìn)行測(cè)試 long t2 = System.currentTimeMillis(); System.out.print(":" + (t2 - t1)+" ms "); } } public static Collection fill(Collection c, int size) { for (int i = 0; i < size; i++) { c.add(Integer.toString(i)); } return c; } public static void main(String[] args) { test(new ArrayList()); System.out.println(); test(new LinkedList()); } }
三、總結(jié)
首先,真的夸一下,這段代碼寫得真是好啊,無論是內(nèi)部類的應(yīng)用還是對(duì)面向?qū)ο蟮恼J(rèn)識(shí),都考慮的恰到好處,哎,我什么時(shí)候才能寫出這么棒的代碼啊。
測(cè)試結(jié)果每次都有些許的差異,但不難得出以下的結(jié)論:
1、在 ArrayList 中進(jìn)行隨機(jī)訪問(即 get())以及循環(huán)反復(fù)是最劃得來的 。原因在于,ArrayList是基于數(shù)組而來的,所以每個(gè)元素都有其對(duì)應(yīng)的index,所以隨機(jī)定位一個(gè)元素要快捷的多。
2、在 LinkedList 中進(jìn)行順序訪問、插入、刪除動(dòng)作的話還是比較高效的。原因在于,插入、刪除的話對(duì)于LinkedList來說只需要改變其排列的一個(gè)node結(jié)點(diǎn)就可以了,而對(duì)于ArrayList來說刪除一個(gè)元素,需要不斷把后面的元素移到前面的位置上。
3、至于順序訪問,之前一直認(rèn)為ArrayList 基于數(shù)組排列,在內(nèi)存中是連續(xù)排列的,應(yīng)該會(huì)快得多,然后多次測(cè)試發(fā)現(xiàn)并不是想象的那樣,或者說ArrayList沒有表現(xiàn)出它該有的優(yōu)勢(shì),甚至還不如LinkedList的訪問速度。原因在于:LinkedList 提供了優(yōu)化的順序訪問性能。
總結(jié)
以上所述是小編給大家介紹的ArrayList 和 LinkedList的執(zhí)行效率比較,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- JAVA LinkedList和ArrayList的使用及性能分析
- 淺談 java中ArrayList、Vector、LinkedList的區(qū)別聯(lián)系
- 對(duì)ArrayList和LinkedList底層實(shí)現(xiàn)原理詳解
- 分析Java中ArrayList與LinkedList列表結(jié)構(gòu)的源碼
- Java中ArrayList和LinkedList的遍歷與性能分析
- java 集合之實(shí)現(xiàn)類ArrayList和LinkedList的方法
- ArrayList和LinkedList區(qū)別及使用場(chǎng)景代碼解析
- java 中ArrayList與LinkedList性能比較
- Java中ArrayList和LinkedList之間的區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java中Array List與Linked List的實(shí)現(xiàn)分析
相關(guān)文章
SpringSecurity+Redis+Jwt實(shí)現(xiàn)用戶認(rèn)證授權(quán)
SpringSecurity是一個(gè)強(qiáng)大且靈活的身份驗(yàn)證和訪問控制框架,本文主要介紹了SpringSecurity+Redis+Jwt實(shí)現(xiàn)用戶認(rèn)證授權(quán),具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07SpringBoot如何進(jìn)行參數(shù)校驗(yàn)實(shí)例詳解
開發(fā)過程中,后臺(tái)的參數(shù)校驗(yàn)是必不可少的,下面這篇文章主要給大家介紹了關(guān)于SpringBoot如何進(jìn)行參數(shù)校驗(yàn)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01Java反射機(jī)制的學(xué)習(xí)總結(jié)
總的來說,java反射機(jī)制是一個(gè)很好用的東西,用它可以解決很多死的東西,因?yàn)榉瓷錂C(jī)制的靈活行很大,有了他,我們就不要花太多的時(shí)間來寫操做數(shù)據(jù)庫(kù)的代碼了,而是方法更多的時(shí)間在項(xiàng)目的邏輯功能上,這個(gè)可以很大的減少開發(fā)時(shí)間,而且代碼的可讀性好2013-09-09Google?Kaptcha驗(yàn)證碼生成的使用實(shí)例說明
這篇文章主要為大家介紹了Google?Kaptcha驗(yàn)證碼的使用實(shí)例說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03如何解決@SpringBootApplication報(bào)錯(cuò)問題
這篇文章主要介紹了如何解決@SpringBootApplication報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07spring boot的健康檢查HealthIndicators實(shí)戰(zhàn)
這篇文章主要介紹了spring boot的健康檢查HealthIndicators實(shí)戰(zhàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10Java 的雙重分發(fā)與 Visitor 模式實(shí)例詳解
這篇文章主要介紹了Java 的雙重分發(fā)與 Visitor 模式實(shí)例詳解,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07java實(shí)現(xiàn)驗(yàn)證碼類生成中文驗(yàn)證碼
java實(shí)現(xiàn)的漢字輸入驗(yàn)證碼,主要包含兩個(gè)類,一個(gè)是生成驗(yàn)證碼,一個(gè)是判斷驗(yàn)證碼輸入是否正確,實(shí)現(xiàn)原理非常簡(jiǎn)單,將漢字和干擾線生成圖片并將漢字保存到session,前臺(tái)獲取每次生成驗(yàn)證碼圖片并用文本框值和session值比較,功能就怎么簡(jiǎn)單2014-01-01