Java中ArrayList和LinkedList区别
作者:网络转载 发布时间:[ 2014/1/7 9:17:24 ] 推荐标签:Java 数组 对象
这个结果不是固定的,但是基本上ArrayList的时间要明显小于LinkedList的时间。因此在这种情况下不宜用LinkedList。二分查找法使用的随机访问(random access)策略,而LinkedList是不支持快速的随机访问的。对一个LinkedList做随机访问所消耗的时间与这个list的大小是成比例的。而相应的,在ArrayList中进行随机访问所消耗的时间是固定的。
如果只是遍历一下:
packagetestlist;
importjava.util.LinkedList;
importjava.util.List;
importjava.util.Random;
importjava.util.ArrayList;
importjava.util.Arrays;
publicclassTestList{
publicstaticfinalintN=50000;
publicstaticList<Integer>values;
static{
Integervals[]=newInteger[N];
Randomr=newRandom();
for(inti=0,currval=0;i<N;i++){
vals[i]=newInteger(currval);
currval+=r.nextInt(100)+1;
}
values=Arrays.asList(vals);
}
staticlongtimeList(List<Integer>lst){
longstart=System.currentTimeMillis();
for(inti=0;i<lst.size();i++){
lst.get(i);
}
returnSystem.currentTimeMillis()-start;
}
publicstaticvoidmain(Stringargs[]){
System.out.println("ArrayList消耗时间:"+timeList(newArrayList<Integer>(values)));
System.out.println("LinkedList消耗时间:"+timeList(newLinkedList<Integer>(values)));
}
}
输出:
ArrayList消耗时间:0
LinkedList消耗时间:1703
这是否表明ArrayList总是比LinkedList性能要好呢?这并不一定,在某些情况下LinkedList的表现要优于ArrayList,有些算法在LinkedList中实现时效率更高。比方说,利用Collections.reverse方法对列表进行反转时,其性能要好些。
看这样一个例子,加入我们有一个列表,要对其进行大量的插入和删除操作,在这种情况下LinkedList是一个较好的选择。请看如下一个极端的例子,我们重复的在一个列表的开端插入一个元素:
package testlist;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class ListDemo {
static final int N = 50000;
static long timeList(List<Object> list) {
long start = System.currentTimeMillis();
Object o = new Object();
for (int i = 0; i < N; i++)
list.add(0, o);
return System.currentTimeMillis() - start;
}
public static void main(String[] args) {
System.out.println("ArrayList耗时:" + timeList(new ArrayList<Object>()));
System.out.println("LinkedList耗时:" + timeList(new LinkedList<Object>()));
}
}
这时我的输出结果是:
ArrayList耗时:1813
LinkedList耗时:0
这和前面一个例子的结果截然相反,当一个元素被加到ArrayList的开端时,所有已经存在的元素都会后移,这意味着数据移动和复制上的开销。相反的,将一个元素加到LinkedList的开端只是简单的未这个元素分配一个记录,然后调整两个连接。在LinkedList的开端增加一个元素的开销是固定的,而在ArrayList的开端增加一个元素的开销是与ArrayList的大小成比例的。

sales@spasvo.com