ArrayList 是一种可增长的数组的实现。
使用ArrayList的优点在于 对 get和set的调用是花费常数时间。缺点就是有新的项插入,和现有的项删除代价昂贵,除非变动是
在ArrayList的末端进行。
使用LinkedList的优点在于新的项的插入和现有的项的删除开销很小。这意味着在表的前端进行添加和删除都是常数时间的操作
,因此LinkedList提供了addFirst,removeFirst,addLast,removeLast,以及getFirst和getLast等都有效的添加删除和访问。缺点
就在于它不容易作索引的,所以get的调用是昂贵的,除非非常接近表的两端。
下面就分别使用add和remove操作来看这两种集合有何差异。
先来看add方法。
package com.songwenjin.list;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class TestList {
public static void makeList1(List<Integer> lst,int N){
lst.clear();
long start=System.currentTimeMillis();
for(int i=0;i<N;i++){
lst.add(i);
}
long end=System.currentTimeMillis();
System.out.println("向表的末端添加"+N+"条花费的时间="+(end-start)+"毫秒");
}
//向表的末端添加数据
public static void main(String[] args) {
int N1=500000;
int N2=1000000;
List<Integer> arrayList=new ArrayList<Integer>();
List<Integer> linkedList=new LinkedList<Integer>();
makeList1(arrayList,N1);
makeList1(arrayList,N2);
makeList1(linkedList,N1);
makeList1(linkedList,N2);
}
}
打印结果如下
向表的末端添加500000条花费的时间=14毫秒
向表的末端添加1000000条花费的时间=39毫秒
向表的末端添加500000条花费的时间=16毫秒
向表的末端添加1000000条花费的时间=24毫秒
可以看到 不管是ArrayLisst(忽略动态扩容)还是LinkedList作为参数进行传递,运行时间都是O(n),就是说是常数的。因为add每次调用都是在表的末端进行从而花费的是常数时间(忽略ArrayList的动态扩容)。