ArrayList和LinkedList性能比较

ArrayList的本质上是一个数组,可以通过索引直接访问元素.
LinkedList的本质上是一个链表,链表是无法通过索引直接访问的,LinkedList通过索引访问属于间接访问,也就是通过遍历来获取索引处的值,因此其效率相对较低,下面通过代码进行测试.

添加,查找,删除测试

添加
//添加元素比较
//ArrayList
ArrayList<Integer> arrayList =  new ArrayList<Integer>();       
System.out.println("添加元素测试");

startTime = new Date().getTime();
for(int i = 0 ;i < 100000 ;i++) {
    arrayList.add(i);
}
endTime = new Date().getTime();
System.out.println("ArrayList添加10 0000个元素所用时间:" + (endTime-startTime) + "ms");
//ArrayList
LinkedList<Integer> linkedList =  new LinkedList<Integer>();        
startTime = new Date().getTime();
for(int i = 0 ;i < 100000 ;i++) {
    linkedList.add(i);
}
endTime = new Date().getTime();
System.out.println("LinkedList添加10 0000个元素所用时间:" + (endTime-startTime) + "ms");

输出

添加元素测试
ArrayList添加10 0000个元素所用时间:11ms
LinkedList添加10 0000个元素所用时间:44ms

从结果上看,由于LinkedList添加元素时需要管理next和first的指向,因此效率会高一点.ArrayList可使用索引直接访问,效率很高.

查找
//查找元素比较
//ArrayList

System.out.println("查找元素测试");

startTime = new Date().getTime();
for(int i = 0 ;i < 100000 ;i++) {
    arrayList.get(i);
}
endTime = new Date().getTime();
System.out.println("ArrayList查找10 0000个元素所用时间:" + (endTime-startTime) + "ms");
//ArrayList

startTime = new Date().getTime();
for(int i = 0 ;i < 100000 ;i++) {
    linkedList.get(i);
}
endTime = new Date().getTime();
System.out.println("LinkedList查找10 0000个元素所用时间:" + (endTime-startTime) + "ms");

输出

查找元素测试
ArrayList查找10 0000个元素所用时间:1ms
LinkedList查找10 0000个元素所用时间:5157ms

由于使用索引进行查找时,LinkedList需要进行遍历获取索引位置,因此效率非常的慢.

删除
//删除元素比较
//ArrayList

System.out.println("删除元素测试");
System.out.println("arrayList.size = " + arrayList.size() + "   linkedList.size = " + linkedList.size());
startTime = new Date().getTime();
for(int i = 0 ;i < 10000 ;i++) {
    arrayList.remove(i);
}
endTime = new Date().getTime();
System.out.println("ArrayList删除10 000个元素所用时间:" + (endTime-startTime) + "ms");
//ArrayList

startTime = new Date().getTime();
for(int i = 0 ;i < 10000 ;i++) {
linkedList.remove(i);
}
endTime = new Date().getTime();
System.out.println("LinkedList删除10 000个元素所用时间:" + (endTime-startTime) + "ms");

输出

删除元素测试
arrayList.size = 100000   linkedList.size = 100000
ArrayList删除10 000个元素所用时间:254ms
LinkedList删除10 000个元素所用时间:155ms

由于ArrayList本质上是数组,因此删除元素时该元素后面的元素都要进行移动,
而LinkedList先是定位元素位置,然后管理next和prev指向即可.而且ArrayList的删除操作随着数据量增大而操作时间有明显的提高.因此删除的效率ArrayList是非常低的

操作ArrayListLinkedList数据量备注
添加14 ms36ms5 0000for(int i = 0 ;i < maxCount ;i++)末尾添加
添加23 ms31ms10 0000for(int i = 0 ;i < maxCount ;i++)末尾添加
添加300 ms8ms5 0000for(int i = 0 ;i < maxCount ;i++)开头添加
添加1035 ms18ms10 0000for(int i = 0 ;i < maxCount ;i++)开头添加
查找1123295 0000for(int i = 0 ;i < maxCount ;i++)
查找11555710 0000for(int i = 0 ;i < maxCount ;i++)
查找685 0000for(Integer item:arrayList)
查找11910 0000for(Integer item:arrayList)
查找445 0000迭代器while (linkedListIterator.hasNext())
查找11810 00000迭代器while (linkedListIterator.hasNext())
删除27775 0000for(int i = 0 ;i < maxCount ;i++) 移除索引0
删除10431010 0000for(int i = 0 ;i < maxCount ;i++)移除索引0

对于添加元素,如果对元素顺序没有要求,两者的效率并不差多少;
对于查找元素,如果使用for循环,那么LinkedList的效率将会非常的差,但使用迭代器访问,那么相差不大.
对于删除元素.由于需要移动元素ArrayList的效率也会很差.

因此如果应用中查找比较多,建议使用ArrayList;
如果应用中删除比较多,建议使用LinkList;

相关文章

JDK9.0 ArrayList源码阅读记录
JDK9.0 LinkedList源码阅读记录
ArrayList和LinkedList性能比较
JDK9.0 Vector源码阅读记录
JDK9.0 Hashtable源码阅读记录
Java9.0 HashMap源码阅读记录
JDK9.0 HashSet源码阅读记录

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值