欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > > 文章正文

ArrayList和LinkedList的添加、查找、删除的性能测试,

来源: javaer 分享于  点击 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是链表结构相对数组来说比较复杂,在添加数据操作上比较消耗时间,而在删除操作时,因为大部分时间都花费在查找上,所以删除操作时间变长。

相关文章

    暂无相关文章

用户点评