本文主要是介绍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可使用索引直接访问,效率很高.
查找
//查找元素比较
//ArrayListSystem.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");
//ArrayListstartTime = 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需要进行遍历获取索引位置,因此效率非常的慢.
删除
//删除元素比较
//ArrayListSystem.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");
//ArrayListstartTime = 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是非常低的
操作 | ArrayList | LinkedList | 数据量 | 备注 |
---|---|---|---|---|
添加 | 14 ms | 36ms | 5 0000 | for(int i = 0 ;i < maxCount ;i++)末尾添加 |
添加 | 23 ms | 31ms | 10 0000 | for(int i = 0 ;i < maxCount ;i++)末尾添加 |
添加 | 300 ms | 8ms | 5 0000 | for(int i = 0 ;i < maxCount ;i++)开头添加 |
添加 | 1035 ms | 18ms | 10 0000 | for(int i = 0 ;i < maxCount ;i++)开头添加 |
查找 | 11 | 2329 | 5 0000 | for(int i = 0 ;i < maxCount ;i++) |
查找 | 11 | 5557 | 10 0000 | for(int i = 0 ;i < maxCount ;i++) |
查找 | 6 | 8 | 5 0000 | for(Integer item:arrayList) |
查找 | 11 | 9 | 10 0000 | for(Integer item:arrayList) |
查找 | 4 | 4 | 5 0000 | 迭代器while (linkedListIterator.hasNext()) |
查找 | 11 | 8 | 10 00000 | 迭代器while (linkedListIterator.hasNext()) |
删除 | 277 | 7 | 5 0000 | for(int i = 0 ;i < maxCount ;i++) 移除索引0 |
删除 | 1043 | 10 | 10 0000 | for(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源码阅读记录
这篇关于ArrayList和LinkedList性能比较的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!