日期:2014-05-20  浏览次数:20741 次

求问一个关于Vector,LinkedList,ArrayList性能上的问题?
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.Vector;

//测试LinkedList,ArrayList,Vector这三种数组的插入速度和查询速度
public class lianxi02 {

/**
 * 测试插入数据
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
LinkedList<String> ll = new LinkedList<String>();
ArrayList<String> al = new ArrayList<String>();
Vector<String> v = new Vector<String>();
long time1 = new Date().getTime();
for (int i = 0; i < 30000; i++) {
ll.add(new Integer(i).toString());
}
long time2 = new Date().getTime();
System.out.println("linkedList:" + (time2 - time1));
for (int i = 0; i < 30000; i++) {
al.add(new Integer(i).toString());
}
long time3 = new Date().getTime();
System.out.println("ArrayList:" + (time3 - time2));

for (int i = 0; i < 30000; i++) {
v.add(new Integer(i).toString());
}
long time4 = new Date().getTime();
System.out.println("Vector:" + (time4 - time3));

// 测试查询数据
for (int i = 0; i < ll.size(); i++) {
String s = ll.get(i);
}
long time5 = new Date().getTime();
System.out.println("LinkedList2:" + (time5 - time4));

for (int i = 0; i < al.size(); i++) {
String s = al.get(i);
}
long time6 = new Date().getTime();
System.out.println("ArrayList2:" + (time6 - time5));

for (int i = 0; i < v.size(); i++) {
String s = v.get(i);
}
long time7 = new Date().getTime();
System.out.println("Vector2:" + (time7 - time6));
}

}

以上是我的代码,测试结果如下:
linkedList:22
ArrayList:8
Vector:8
LinkedList2:2742
ArrayList2:4
Vector2:4

我想问为什么LinkedList插入和遍历速度都很慢呢,按网上一道笔试题的答案,上面说LinkedList插入速度快,可是程序结果显示linkedList:22,插入速度是最慢的。还有LinkedList2:2742的遍历速度为什么这么慢呢?

------解决方案--------------------
这是月经贴么?
看源码就清楚了
ArrayList维护的是数组,get(index)直接由数组下标得到元素,所以快。速度和查找的位置无关
LinkedList维护的是链表,get(index)是从两头往中间挨个找。位置越往中间查询速度就越慢
插入
由于ArrayList维护的是数组,add(index,e)会将index位置以后的元素全部后移,调用了System.arraycopy(...)方法。所以index越靠前,arraycopy耗时越多
LinedList的add(index,e)先从两头挨个找到index位置,再插入。插入的操作是固定的,损失的是查询的时间
所以插入耗时和位置还是有关的。ArrayList越往前插入约耗时,LikedList插入越往中间约耗时