ArrayList和LinkedList的添加、查找、删除的性能测试,
分享于 点击 35051 次 点评:182
ArrayList和LinkedList的添加、查找、删除的性能测试,
package testList;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
public class TestArrayListAndlinkedList {
public static void main(String[] args) {
System.out.println("ArrayList的添加、查找、删除的性能测试");
System.out.println(testArrayList(1000000).toString());
System.out.println("LinkedList的添加、查找、删除的性能测试");
System.out.println(testLinkedList(1000000).toString());
}
/**
* ArrayList的添加、查找、删除的性能测
* @param number 添加对象的数量
* @return
*/
private static Map<String, Long> testArrayList(int number){
Map<String, Long> map=new HashMap<String, Long>();//map用于保存测试结果
ArrayList<Test> list=new ArrayList<Test>();
/*
* 添加测试
*/
Long start=System.currentTimeMillis();
for(int i=0; i<number;i++){
list.add(new Test(i));
}
Long end=System.currentTimeMillis();
map.put("add:"+number+"个对象耗时", end-start);
/*
* 查找测试
*/
start=System.currentTimeMillis();
for(int i=1;i<number;i=i*10){
// list.indexOf(i);//查找1、10、100..的数据
list.indexOf((int)(Math.random()*number));//随机查找
}
end=System.currentTimeMillis();
map.put("indexOf:"+number/10+"个对象耗时", end-start);
/*
* 删除测试
*/
int size;
//计算删除的个数
int time=number/1000000<1000?1000:number/1000000;
if(time>number)time=number-1;
start=System.currentTimeMillis();
for(int i=0;i<time;i++){
// size=list.size()/2;//从中间删除
size=(int)(Math.random()*list.size());//随机删除
list.remove(size);
}
end=System.currentTimeMillis();
map.put("remove:"+time+"个对象耗时", end-start);
return map;
}
/**
* LinkedList的添加、查找、删除的性能测
* @param number 添加对象的数量
* @return
*/
private static Map<String, Long> testLinkedList(int number){
Map<String, Long> map=new HashMap<String, Long>();//map用于保存测试结果
LinkedList<Test> list=new LinkedList<Test>();
/*
* 添加测试
*/
Long start=System.currentTimeMillis();
for(int i=0; i<number;i++){
list.add(new Test(i));
}
Long end=System.currentTimeMillis();
map.put("add:"+number+"个对象耗时", end-start);
/*
* 查找测试
*/
start=System.currentTimeMillis();
for(int i=1;i<number;i=i*10){
// list.indexOf(i);//查找1、10、100..的数据
list.indexOf((int)(Math.random()*number));//随机查找
}
end=System.currentTimeMillis();
map.put("indexOf:"+number/10+"个对象耗时", end-start);
/*
* 删除测试
*/
int size;
//计算删除的个数
int time=number/1000000<1000?1000:number/1000000;
if(time>number)time=number-1;
start=System.currentTimeMillis();
for(int i=0;i<time;i++){
// size=list.size()/2;//从中间删除
size=(int)(Math.random()*list.size());//随机删除
list.remove(size);
}
end=System.currentTimeMillis();
map.put("remove:"+time+"个对象耗时", end-start);
return map;
}
}
class Test{
private int i;
public Test(int i){
this.i=i;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
}
测试结果:
ArrayList的添加、查找、删除的性能测试
{add:1000000个对象耗时=17, remove:1000个对象耗时=113, indexOf:100000个对象耗时=18}
LinkedList的添加、查找、删除的性能测试
{add:1000000个对象耗时=140, remove:1000个对象耗时=3369, indexOf:100000个对象耗时=45}
ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
1.对于随机访问,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
2.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
但测试结果与理论不相符。ArrayList在添加、查找、删除的性能都优于LinkedList。
这是为什么呀呀呀???
细细想一下,当顺序添加数据时,ArrayList的容量足够大,就不把时间浪费在扩容上,如果对象是很简单对象,在删除操作时移动数组也是足够快的。LinkedList是链表结构相对数组来说比较复杂,在添加数据操作上比较消耗时间,而在删除操作时,因为大部分时间都花费在查找上,所以删除操作时间变长。
相关文章
- 暂无相关文章
用户点评