欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入淺析ArrayList 和 LinkedList的執(zhí)行效率比較

 更新時間:2017年08月14日 15:25:43   作者:JMCui  
這篇文章主要介紹了ArrayList 和 LinkedList的執(zhí)行效率比較的相關(guān)資料,需要的朋友可以參考下

一、概念:

    一般我們都知道ArrayList* 由一個數(shù)組后推得到的 List。作為一個常規(guī)用途的對象容器使用,用于替換原先的 Vector。允許我們快速訪問元素,但在從列表中部插入和刪除元素時,速度卻嫌稍慢。一般只應(yīng)該用ListIterator 對一個 ArrayList 進(jìn)行向前和向后遍歷,不要用它刪除和插入元素;與 LinkedList 相比,它的效率要低許多LinkedList 提供優(yōu)化的順序訪問性能,同時可以高效率地在列表中部進(jìn)行插入和刪除操作。但在進(jìn)行隨機(jī)訪問時,速度卻相當(dāng)慢,此時應(yīng)換用 ArrayList。

二、測試

    本來自己寫了一些測試類想測試下ArrayList和LinkedList的性能比較,發(fā)現(xiàn)怎么寫都差強(qiáng)人意,今天在《Thinking in Java》中看到了這樣的一段代碼,個人覺得寫得不賴。

public class ListPerformance
{
 private static final int REPS = 100;
 private abstract static class Tester//內(nèi)部抽象類,作為List測試。
 {
  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)//一個測試數(shù)組,存儲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());//輸出測試的類名稱
  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)行測試
   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)用還是對面向?qū)ο蟮恼J(rèn)識,都考慮的恰到好處,哎,我什么時候才能寫出這么棒的代碼啊。

    測試結(jié)果每次都有些許的差異,但不難得出以下的結(jié)論:

        1、在 ArrayList 中進(jìn)行隨機(jī)訪問(即 get())以及循環(huán)反復(fù)是最劃得來的 。原因在于,ArrayList是基于數(shù)組而來的,所以每個元素都有其對應(yīng)的index,所以隨機(jī)定位一個元素要快捷的多。

        2、在 LinkedList 中進(jìn)行順序訪問、插入、刪除動作的話還是比較高效的。原因在于,插入、刪除的話對于LinkedList來說只需要改變其排列的一個node結(jié)點就可以了,而對于ArrayList來說刪除一個元素,需要不斷把后面的元素移到前面的位置上。

        3、至于順序訪問,之前一直認(rèn)為ArrayList 基于數(shù)組排列,在內(nèi)存中是連續(xù)排列的,應(yīng)該會快得多,然后多次測試發(fā)現(xiàn)并不是想象的那樣,或者說ArrayList沒有表現(xiàn)出它該有的優(yōu)勢,甚至還不如LinkedList的訪問速度。原因在于:LinkedList 提供了優(yōu)化的順序訪問性能。

總結(jié)

以上所述是小編給大家介紹的ArrayList 和 LinkedList的執(zhí)行效率比較,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Java如何處理延遲任務(wù)過程解析

    Java如何處理延遲任務(wù)過程解析

    這篇文章主要介紹了Java如何處理延遲任務(wù)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • SpringSecurity+Redis+Jwt實現(xiàn)用戶認(rèn)證授權(quán)

    SpringSecurity+Redis+Jwt實現(xiàn)用戶認(rèn)證授權(quán)

    SpringSecurity是一個強(qiáng)大且靈活的身份驗證和訪問控制框架,本文主要介紹了SpringSecurity+Redis+Jwt實現(xiàn)用戶認(rèn)證授權(quán),具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • SpringBoot如何進(jìn)行參數(shù)校驗實例詳解

    SpringBoot如何進(jìn)行參數(shù)校驗實例詳解

    開發(fā)過程中,后臺的參數(shù)校驗是必不可少的,下面這篇文章主要給大家介紹了關(guān)于SpringBoot如何進(jìn)行參數(shù)校驗的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • Java反射機(jī)制的學(xué)習(xí)總結(jié)

    Java反射機(jī)制的學(xué)習(xí)總結(jié)

    總的來說,java反射機(jī)制是一個很好用的東西,用它可以解決很多死的東西,因為反射機(jī)制的靈活行很大,有了他,我們就不要花太多的時間來寫操做數(shù)據(jù)庫的代碼了,而是方法更多的時間在項目的邏輯功能上,這個可以很大的減少開發(fā)時間,而且代碼的可讀性好
    2013-09-09
  • Google?Kaptcha驗證碼生成的使用實例說明

    Google?Kaptcha驗證碼生成的使用實例說明

    這篇文章主要為大家介紹了Google?Kaptcha驗證碼的使用實例說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • idea中的lombok不生效的四種解決方法

    idea中的lombok不生效的四種解決方法

    Lombok項目是一個java庫,它可以自動插入到編輯器和構(gòu)建工具中,本文將詳細(xì)給大家介紹idea中的lombok不生效的四種解決方法,需要的朋友可以參考下
    2023-05-05
  • 如何解決@SpringBootApplication報錯問題

    如何解決@SpringBootApplication報錯問題

    這篇文章主要介紹了如何解決@SpringBootApplication報錯問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • spring boot的健康檢查HealthIndicators實戰(zhàn)

    spring boot的健康檢查HealthIndicators實戰(zhàn)

    這篇文章主要介紹了spring boot的健康檢查HealthIndicators實戰(zhàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java 的雙重分發(fā)與 Visitor 模式實例詳解

    Java 的雙重分發(fā)與 Visitor 模式實例詳解

    這篇文章主要介紹了Java 的雙重分發(fā)與 Visitor 模式實例詳解,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • java實現(xiàn)驗證碼類生成中文驗證碼

    java實現(xiàn)驗證碼類生成中文驗證碼

    java實現(xiàn)的漢字輸入驗證碼,主要包含兩個類,一個是生成驗證碼,一個是判斷驗證碼輸入是否正確,實現(xiàn)原理非常簡單,將漢字和干擾線生成圖片并將漢字保存到session,前臺獲取每次生成驗證碼圖片并用文本框值和session值比較,功能就怎么簡單
    2014-01-01

最新評論