List集合:针对不同实现类的效率测试

直接上代码:

package com.collection;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
import java.util.Vector;
/**
 * 
 * @ClassName:  ListTest02
 * @Description:测试List接口下,不同实现类增、删、查的效率
 * @author: aipande
 * @date:   2019年8月6日 上午11:05:35
 */
public class ListTest02 {

	//测试List下不同的类,操作100000个元素所消耗的时间
	public static void main(String[] args) {
		
		//元素总数
		int count = 100000;
		
		//初始化集合
		ArrayList<Integer> a = new ArrayList<Integer>();
		LinkedList<Integer> b = new LinkedList<Integer>();
		Vector<Integer> c = new Vector<Integer>();
		Stack<Integer> d = new Stack<Integer>();
		
		//向指定位置插入元素
		System.out.println("插入元素-------------------------------");
		insertData(a,count);
		insertData(b,count);
		insertData(c,count);
		insertData(d,count);
		
		//查询
		System.out.println("查询元素-------------------------------");
		selectData(a);
		selectData(b);
		selectData(c);
		selectData(d);
		
		//删除集合中的所有元素
		System.out.println("删除元素-------------------------------");
		deleteData(a);
		deleteData(b);
		deleteData(c);
		deleteData(d);
	}
	
	//向集合中插入元素
	public static void insertData(List<Integer> l,int count){
		
		//开始时间
		long startTime = System.currentTimeMillis();
		
		//插入元素
		for(int i =0;i<count;i++){
			l.add(0, i);
		}
		//结束时间
		long endTime = System.currentTimeMillis();
		
		//总时间
		long cost = endTime-startTime;
		System.out.println(l.getClass().getName()+"插入"+count+"个元素消耗的时间:"+cost+"毫秒,"+"集合元素个数"+l.size());
	}
	
	//删除所有集合元素
	public static void deleteData(List<Integer> l){
		
		//开始时间
		long startTime = System.currentTimeMillis();
		
		//删除元素
		while(l.size()>0){
			l.remove(0);
		}
		//结束时间
		long endTime = System.currentTimeMillis();
		
		//总时间
		long cost = endTime-startTime;
		System.out.println(l.getClass().getName()+"删除100000个元素消耗的时间:"+cost+"毫秒,"+"集合元素个数"+l.size());
	}
	
	//查询所有集合元素
	public static void selectData(List<Integer> l){
		
		//开始时间
		long startTime = System.currentTimeMillis();
		
		//查询元素
		for(int i = 0;i<l.size();i++){
			l.get(i);
		}
		//结束时间
		long endTime = System.currentTimeMillis();
		
		//总时间
		long cost = endTime-startTime;
		System.out.println(l.getClass().getName()+"查询100000个元素消耗的时间:"+cost+"毫秒,"+"集合元素个数"+l.size());
	}
	
}

结果:

插入元素-------------------------------
java.util.ArrayList插入100000个元素消耗的时间:636毫秒,集合元素个数100000
java.util.LinkedList插入100000个元素消耗的时间:10毫秒,集合元素个数100000
java.util.Vector插入100000个元素消耗的时间:629毫秒,集合元素个数100000
java.util.Stack插入100000个元素消耗的时间:632毫秒,集合元素个数100000
查询元素-------------------------------
java.util.ArrayList查询100000个元素消耗的时间:7毫秒,集合元素个数100000
java.util.LinkedList查询100000个元素消耗的时间:6403毫秒,集合元素个数100000
java.util.Vector查询100000个元素消耗的时间:9毫秒,集合元素个数100000
java.util.Stack查询100000个元素消耗的时间:11毫秒,集合元素个数100000
删除元素-------------------------------
java.util.ArrayList删除100000个元素消耗的时间:583毫秒,集合元素个数0
java.util.LinkedList删除100000个元素消耗的时间:5毫秒,集合元素个数0
java.util.Vector删除100000个元素消耗的时间:621毫秒,集合元素个数0
java.util.Stack删除100000个元素消耗的时间:555毫秒,集合元素个数0
小结

1.为什么ArrayList、Vector、Stack的查询效率高,增删效率低?
底层是数组,数组元素在内存的中的存储地址是连续的。针对查询,只要知道元素的索引,可以根据数组首元素地址和偏移量,快速计算出所查询元素的内存地址,因而查询效率高。在指定位置删除和插入元素时,该位置后的元素需要整体向前或向后移动一位,因而消耗时间。

2.为什么LinkedList的增删效率高,查询效率低?
LinkedList的底层结构是双向链表,链表中的节点在内存中的分布是不连续、随机的。因此无法根据偏移量计算节点的内存地址,只能从首节点开始,往下依次查找,因此,如果查询的节点靠后,则需要将前面的节点全都遍历一次,消耗的时间长。针对增删:只需要修改前一节点指向后一节点的地址,以及后一节点指向前一节点的地址,而不需要移动后续所有节点的位置,相对的耗时短。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值