ArrayList和LinkedList是List接口兩種比較流行的實現方式。
ArrayList類提供了List ADT的一種可增長數組的實現,他的優點是對於get和set方法的調用話費常數時間(即O(N)),缺點是新插入項和現有項的刪除代價昂貴,除非變動在ArrayList末端進行。
- LinkedList類提供了List ADT的雙向鏈表的實現,LinkedList的優點在於新插入項和現有項的刪除的開銷很小,在表的前端進行刪除和添加都是常數的時間(O(N))。他的缺點是不容易索引,因此使用get方法的代價很大。
- 實例代碼:
//不管是ArrayList還是LinkedList,此方法的運行時間都是O(N)
//add每次都是在表的末端進行
public static void test1(List<Integer> l1,int N){
l1.clear();
for(int i=0;i<N.i++){
l1.add(i);
}
}
//對LinkedList運行時間爲O(N),但是對於ArrayList運行時間爲O(N²)
public static void test2(List<Integer> l1,int N){
l1.clear();
for(int i=0;i<N.i++){
l1.add(0,i);
}
}
//對ArrayList運行時間爲O(N),但是對於LinkedList運行時間爲O(N²)
public static void test3(List<Integer> l1){
int sum = 0;
for(int i=0;i<l1.size().i++){
sum += l1.get(i);
}
}
//對LinkedList運行時間爲O(N),但是對於ArrayList運行時間爲O(N²)
public static void test4(List<Integer> l1){
Iterator<Integer> i1 = l1.iterator();
while(i1.hasNext()){
if(i1.next()%2==0)
i1.remove();
}
}
- 附自定義ArrayList和LinkedList代碼地址
代碼來源《數據結構與算法分析Java語音描述》