ArrayList和LinkedList的操作性能對比

ArrayList和LinkedList都是實現了Collection和List接口,繼承AbstractList的鏈表。

  • ArrayList

    List 接口的大小可變數組的實現。實現了所有可選列表操作,並允許包括 null 在內的所有元素。除了實現 List 接口外,此類還提供一些方法來操作內部用來存儲列表的數組的大小。(此類大致上等同於Vector 類,除了此類是不同步的。)

  • LinkedList::

    List 接口的鏈接列表實現。實現所有可選的列表操作,並且允許所有元素(包括 null)。除了實現 List 接口外,LinkedList 類還爲在列表的開頭及結尾getremove 和insert 元素提供了統一的命名方法。這些操作允許將鏈接列表用作堆棧、隊列或雙端隊列 (deque)。

下面就根據幾個示例才測試一下它們之間使用的性能區別:

  1. 我們創建一個成員變量List list;在不同的testcase中分別實例化爲ArrayList和LinkedList,然後往各個列表中添加100000條數據,根據操作前後的時間差來判斷他們的插入性能;
    [java] view plain copy
    1. package org.wxp.collection;  
    2.   
    3. import java.util.ArrayList;  
    4. import java.util.LinkedList;  
    5. import java.util.List;  
    6.   
    7. import junit.framework.TestCase;  
    8.   
    9. /** 
    10.  * 測試LinkedList和ArrayList的添加性能 
    11.  *  
    12.  * @author Champion.Wong 
    13.  *  
    14.  */  
    15. public class Test_List01 extends TestCase {  
    16.     private List list = null;  
    17.     private long start = 0;  
    18.     private long end = 0;  
    19.   
    20.     /** 
    21.      * 測試LinkedList的插入性能 
    22.      */  
    23.     public void test() {  
    24.         list = new LinkedList();  
    25.         start = System.currentTimeMillis(); // 記錄執行操作前時間  
    26.         for (int i = 0; i < 1000000; i++) {  
    27.             list.add("Hello java.");  
    28.         }  
    29.         end = System.currentTimeMillis();// 記錄執行操作後時間  
    30.   
    31.         System.out.println("LinkedList用時:" + (end - start));  
    32.     }  
    33.   
    34.     /** 
    35.      * 測試ArrayList的插入性能 
    36.      */  
    37.     public void test1() {  
    38.         list = new ArrayList();  
    39.         start = System.currentTimeMillis();// 記錄執行操作前時間  
    40.         for (int i = 0; i < 1000000; i++) {  
    41.             list.add("Hello java.");  
    42.         }  
    43.         end = System.currentTimeMillis();// 記錄執行操作後時間  
    44.   
    45.         System.out.println("ArrayList用時:" + (end - start));  
    46.     }  
    47. }  
    執行後的控制檯結果爲:
  2. 我們創建一個成員變量List list;在不同的testcase中分別實例化爲ArrayList和LinkedList,然後往各個列表中添加100000條數據。然後遍歷這些集合,根據操作前後的時間差來判斷他們的插入性能;
    [java] view plain copy
    1. package org.wxp.collection;  
    2.   
    3. import java.util.ArrayList;  
    4. import java.util.LinkedList;  
    5. import java.util.List;  
    6.   
    7. import junit.framework.TestCase;  
    8.   
    9. /** 
    10.  * 測試LinkedList和ArrayList的遍歷性能 
    11.  *  
    12.  * @author Champion.Wong 
    13.  *  
    14.  */  
    15. public class Test_List02 extends TestCase {  
    16.     private List list = null;  
    17.     private long start = 0;  
    18.     private long end = 0;  
    19.   
    20.     public void test() {  
    21.         list = new LinkedList();  
    22.         for (int i = 0; i < 100000; i++) {  
    23.             list.add("Hello Java!");  
    24.         }  
    25.   
    26.         start = System.currentTimeMillis();  
    27.         for (int i = 0; i < 100000; i++) {  
    28.             list.get(i);  
    29.         }  
    30.         end = System.currentTimeMillis();  
    31.   
    32.         System.out.println("LinkedList用時:" + (end - start));  
    33.     }  
    34.   
    35.     public void test1() {  
    36.         list = new ArrayList();  
    37.         for (int i = 0; i < 100000; i++) {  
    38.             list.add("Hello Java!");  
    39.         }  
    40.   
    41.         start = System.currentTimeMillis();  
    42.         for (int i = 0; i < 100000; i++) {  
    43.             list.get(i);  
    44.         }  
    45.         end = System.currentTimeMillis();  
    46.   
    47.         System.out.println("ArrayList用時:" + (end - start));  
    48.     }  
    49. }  

    執行之後的結果爲:


    再看看Junit控制檯的顯示情況:
  3. 我們分別在兩個方法裏定義一個ArrayList和LinkedList,分別往每個集合中插入100000條數據。ArrayList使用add(object)方法來插入,而LinkedList則使用獨自的addFirst(object)和addLast(object)來進行收尾同時插入。
    [java] view plain copy
    1. package org.wxp.collection;  
    2.   
    3. import java.util.ArrayList;  
    4. import java.util.LinkedList;  
    5. import java.util.List;  
    6.   
    7. import junit.framework.TestCase;  
    8.   
    9. /** 
    10.  * 測試LinkedList和ArrayList的首位操作性能 
    11.  *  
    12.  * @author Champion.Wong 
    13.  *  
    14.  */  
    15. public class Test_List03 extends TestCase {  
    16.     private long start = 0;  
    17.     private long end = 0;  
    18.   
    19.     public void test() {  
    20.         LinkedList list = new LinkedList();  
    21.   
    22.         start = System.currentTimeMillis();  
    23.         for (int i = 0; i < 100000; i++) {  
    24.             list.addFirst("hello first!");  
    25.             list.addLast("hello first!");  
    26.         }  
    27.         end = System.currentTimeMillis();  
    28.   
    29.         System.out.println("LinkedList用時:" + (end - start));  
    30.     }  
    31.   
    32.     public void test1() {  
    33.         ArrayList list = new ArrayList();  
    34.   
    35.         start = System.currentTimeMillis();  
    36.         for (int i = 0; i < 100000; i++) {  
    37.             list.add("hello first");  
    38.             list.add("hello last");  
    39.         }  
    40.         end = System.currentTimeMillis();  
    41.   
    42.         System.out.println("ArrayList用時:" + (end - start));  
    43.     }  
    44. }  

    再來看看執行結果:

由以上測試結果可以看出:

ArrayList在遍歷和普通插入(add(object))的性能上都優於LinkedList。但是LinkedList在首尾進行操作的性能上明顯優於ArrayList.


並且,ArrayList和LinkedList的操作方法都不是同步的,在併發操作時,不能保證其合理性,在創建的時候可以保證外部同步:

[java] view plain copy
  1. List arrayList = Collections.synchronizedList(new ArrayList(...));  
  2. List linkedList = Collections.synchronizedList(new LinkedList(...));  

轉載請註明出處:http://blog.csdn.net/it_wangxiangpan/article/details/8693803
發佈了185 篇原創文章 · 獲贊 19 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章