直接上代码:
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的底层结构是双向链表,链表中的节点在内存中的分布是不连续、随机的。因此无法根据偏移量计算节点的内存地址,只能从首节点开始,往下依次查找,因此,如果查询的节点靠后,则需要将前面的节点全都遍历一次,消耗的时间长。针对增删:只需要修改前一节点指向后一节点的地址,以及后一节点指向前一节点的地址,而不需要移动后续所有节点的位置,相对的耗时短。