ArrayList和LinkedList都是實現了Collection和List接口,繼承AbstractList的鏈表。
- ArrayList:
List 接口的大小可變數組的實現。實現了所有可選列表操作,並允許包括 null 在內的所有元素。除了實現 List 接口外,此類還提供一些方法來操作內部用來存儲列表的數組的大小。(此類大致上等同於Vector 類,除了此類是不同步的。)
- LinkedList::
List 接口的鏈接列表實現。實現所有可選的列表操作,並且允許所有元素(包括 null)。除了實現 List 接口外,LinkedList 類還爲在列表的開頭及結尾get、remove 和insert 元素提供了統一的命名方法。這些操作允許將鏈接列表用作堆棧、隊列或雙端隊列 (deque)。
下面就根據幾個示例才測試一下它們之間使用的性能區別:
- 我們創建一個成員變量List list;在不同的testcase中分別實例化爲ArrayList和LinkedList,然後往各個列表中添加100000條數據,根據操作前後的時間差來判斷他們的插入性能;
- package org.wxp.collection;
- import java.util.ArrayList;
- import java.util.LinkedList;
- import java.util.List;
- import junit.framework.TestCase;
- /**
- * 測試LinkedList和ArrayList的添加性能
- *
- * @author Champion.Wong
- *
- */
- public class Test_List01 extends TestCase {
- private List list = null;
- private long start = 0;
- private long end = 0;
- /**
- * 測試LinkedList的插入性能
- */
- public void test() {
- list = new LinkedList();
- start = System.currentTimeMillis(); // 記錄執行操作前時間
- for (int i = 0; i < 1000000; i++) {
- list.add("Hello java.");
- }
- end = System.currentTimeMillis();// 記錄執行操作後時間
- System.out.println("LinkedList用時:" + (end - start));
- }
- /**
- * 測試ArrayList的插入性能
- */
- public void test1() {
- list = new ArrayList();
- start = System.currentTimeMillis();// 記錄執行操作前時間
- for (int i = 0; i < 1000000; i++) {
- list.add("Hello java.");
- }
- end = System.currentTimeMillis();// 記錄執行操作後時間
- System.out.println("ArrayList用時:" + (end - start));
- }
- }
- 我們創建一個成員變量List list;在不同的testcase中分別實例化爲ArrayList和LinkedList,然後往各個列表中添加100000條數據。然後遍歷這些集合,根據操作前後的時間差來判斷他們的插入性能;
- package org.wxp.collection;
- import java.util.ArrayList;
- import java.util.LinkedList;
- import java.util.List;
- import junit.framework.TestCase;
- /**
- * 測試LinkedList和ArrayList的遍歷性能
- *
- * @author Champion.Wong
- *
- */
- public class Test_List02 extends TestCase {
- private List list = null;
- private long start = 0;
- private long end = 0;
- public void test() {
- list = new LinkedList();
- for (int i = 0; i < 100000; i++) {
- list.add("Hello Java!");
- }
- start = System.currentTimeMillis();
- for (int i = 0; i < 100000; i++) {
- list.get(i);
- }
- end = System.currentTimeMillis();
- System.out.println("LinkedList用時:" + (end - start));
- }
- public void test1() {
- list = new ArrayList();
- for (int i = 0; i < 100000; i++) {
- list.add("Hello Java!");
- }
- start = System.currentTimeMillis();
- for (int i = 0; i < 100000; i++) {
- list.get(i);
- }
- end = System.currentTimeMillis();
- System.out.println("ArrayList用時:" + (end - start));
- }
- }
執行之後的結果爲:
再看看Junit控制檯的顯示情況: - 我們分別在兩個方法裏定義一個ArrayList和LinkedList,分別往每個集合中插入100000條數據。ArrayList使用add(object)方法來插入,而LinkedList則使用獨自的addFirst(object)和addLast(object)來進行收尾同時插入。
- package org.wxp.collection;
- import java.util.ArrayList;
- import java.util.LinkedList;
- import java.util.List;
- import junit.framework.TestCase;
- /**
- * 測試LinkedList和ArrayList的首位操作性能
- *
- * @author Champion.Wong
- *
- */
- public class Test_List03 extends TestCase {
- private long start = 0;
- private long end = 0;
- public void test() {
- LinkedList list = new LinkedList();
- start = System.currentTimeMillis();
- for (int i = 0; i < 100000; i++) {
- list.addFirst("hello first!");
- list.addLast("hello first!");
- }
- end = System.currentTimeMillis();
- System.out.println("LinkedList用時:" + (end - start));
- }
- public void test1() {
- ArrayList list = new ArrayList();
- start = System.currentTimeMillis();
- for (int i = 0; i < 100000; i++) {
- list.add("hello first");
- list.add("hello last");
- }
- end = System.currentTimeMillis();
- System.out.println("ArrayList用時:" + (end - start));
- }
- }
再來看看執行結果:
由以上測試結果可以看出:
ArrayList在遍歷和普通插入(add(object))的性能上都優於LinkedList。但是LinkedList在首尾進行操作的性能上明顯優於ArrayList.
並且,ArrayList和LinkedList的操作方法都不是同步的,在併發操作時,不能保證其合理性,在創建的時候可以保證外部同步:
- List arrayList = Collections.synchronizedList(new ArrayList(...));
- List linkedList = Collections.synchronizedList(new LinkedList(...));
轉載請註明出處:http://blog.csdn.net/it_wangxiangpan/article/details/8693803