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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值