中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

深入淺析ArrayList 和 LinkedList的執行效率比較

發布時間:2020-08-31 08:33:53 來源:腳本之家 閱讀:165 作者:JMCui 欄目:編程語言

一、概念:

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

二、測試

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

public class ListPerformance
{
 private static final int REPS = 100;
 private abstract static class Tester//內部抽象類,作為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)//一個測試數組,存儲get(隨機取)、iteration(順序遍歷)、insert(中間插入)、remove(隨機刪除)
 {
  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);//進行測試
   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());
 }
}

深入淺析ArrayList 和 LinkedList的執行效率比較

三、總結

    首先,真的夸一下,這段代碼寫得真是好啊,無論是內部類的應用還是對面向對象的認識,都考慮的恰到好處,哎,我什么時候才能寫出這么棒的代碼啊。

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

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

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

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

總結

以上所述是小編給大家介紹的ArrayList 和 LinkedList的執行效率比較,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

革吉县| 迁安市| 沽源县| 佳木斯市| 克什克腾旗| 永登县| 株洲市| 仪征市| 平舆县| 峨眉山市| 邯郸县| 永吉县| 德清县| 雷波县| 云阳县| 开远市| 色达县| 荣昌县| 襄樊市| 唐河县| 克东县| 彩票| 报价| 玉门市| 上思县| 尉氏县| 砀山县| 阿瓦提县| 彝良县| 江西省| 宣化县| 林芝县| 定襄县| 石城县| 黄大仙区| 孝感市| 香格里拉县| 富宁县| 西宁市| 西乌珠穆沁旗| 崇左市|