ArrayList和LinkedList的區別
引言
ArrayList和LinkedList 都是對List接口的實現,是常用的兩種存儲結構,那麼它們有哪些區別呢。
區別
1、ArrayList是實現了基於Array(動態數組)的數據結構,LinkedList基於Link(鏈表)的數據結構。
前者是數組隊列,相當於動態數組;後者爲雙向鏈表結構,也可當作堆棧、隊列、雙端隊列。
2、當隨機訪問List時(get和set操作),ArrayList比LinkedList的效率更高,因爲LinkedList是線性的數據存儲方式,所以需要移動指針從前往後依次查找。
3、當對數據進行增加和刪除的操作時(add和remove操作),LinkedList比ArrayList的效率更高,因爲ArrayList是數組,所以在其中進行增刪操作時,會對操作點之後所有數據的下標索引造成影響,需要進行數據的移動。
4、從利用效率來看,ArrayList自由性較低,因爲它需要手動的設置固定大小的容量,但是它的使用比較方便,只需要創建,然後添加數據,通過調用下標進行使用;
而LinkedList自由性較高,能夠動態的隨數據量的變化而變化(擴容),但是它不便於使用。
5、ArrayList主要控件開銷在於需要在List列表預留一定空間;而LinkList主要控件開銷在於需要存儲結點信息以及結點指針信息。
源碼:
package com.demo.test;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
*
* @author liu.hb
*ArrayList和LinkedList的大致區別如下:
1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。
2.對於隨機訪問get和set,ArrayList覺得優於LinkedList,因爲LinkedList要移動指針。
3.對於新增和刪除操作add和remove,LinedList比較佔優勢,因爲ArrayList要移動數據。
*/
public class ListTest {
static final int T = 500000;
/**
*
* @param list 參數
* @return 列表添加數據需要的時間
*/
static long timeList(List<Object> list) {
long start = System.currentTimeMillis();
Object object = new Object();
for (int i = 0; i < T; i++) {
list.add(0, object);
}
long time = System.currentTimeMillis() - start;
return time;
}
/**
*
* @param list 參數
* @return 列表查詢數據需要的時間
*/
static long readList(List<Object> list) {
long start = System.currentTimeMillis();
for (int i = 0, j = list.size(); i < j; i++) {
}
long time = System.currentTimeMillis() - start;
return time;
}
/**
*
* @param list 參數
* @return 列表添加數據
*/
static List<Object> addList(List<Object> list) {
Object object = new Object();
for (int i = 0; i < T; i++) {
list.add(0, object);
}
return list;
}
public static void main(String[] args) {
List<Object> list1 = new ArrayList<Object>();
List<Object> list2 = new LinkedList<Object>();
System.out.println("ArrayList添加" + T + "條耗時:" + timeList(list1));
System.out.println("LinkedList添加" + T + "條耗時:" + timeList(list2));
System.out.println("ArrayList長度:"+list1.size()+" LinkedList長度:"+list2.size());
System.out.println("ArrayList查找" + T + "條耗時:" + readList(list1));
System.out.println("LinkedList查找" + T + "條耗時:" + readList(list2));
}
}
運行結果
我們可以看出ArrayList讀取數據效率更高,LinkedList添加或刪除數據效率更高。