ArrayList和linkedList的插入、查找、删除
2017-07-08 18:06
429 查看
ArrayList是动态扩展的数组,LinkedList是双向链表的数据结构。
所以大多数人持有这样观点:
AL易于查找;有频繁的插入、删除使用AL不合适,因涉及到其他元素左右移动问题;
LL不易于查找;有频繁的插入、删除操作使用LL比较合适,因只涉及修改前后连接;
这里先不对以上观点给出我的结论,也没有非常仔细跟踪过java源码。这里给出一个测试样例及测试结果。测试结果的结论似乎不支持以上说法。当然,可能有涉及到测试样例的合理性、数据量是否足够大的问题,但个人认为这个例子还是合理的。大家有疑问的可以提出。欢迎大家多多交流。
测试结果
所以大多数人持有这样观点:
AL易于查找;有频繁的插入、删除使用AL不合适,因涉及到其他元素左右移动问题;
LL不易于查找;有频繁的插入、删除操作使用LL比较合适,因只涉及修改前后连接;
这里先不对以上观点给出我的结论,也没有非常仔细跟踪过java源码。这里给出一个测试样例及测试结果。测试结果的结论似乎不支持以上说法。当然,可能有涉及到测试样例的合理性、数据量是否足够大的问题,但个人认为这个例子还是合理的。大家有疑问的可以提出。欢迎大家多多交流。
@SuppressWarnings("all") static final class ArrayListAndLinkedArrayList{ static final int N=100000; static long timeList(List list){ long start=System.currentTimeMillis(); Object o = new Object(); for(int i=0;i<N;i++) { int id = (int) new java.util.Random().nextInt((i==0)?(i+1):i); // System.out.println(id); list.add(id, o); } return System.currentTimeMillis()-start; } static long readList(List list){ long start=System.currentTimeMillis(); for(int i=0,j=list.size();i<j;i++){ int id = (int) new java.util.Random().nextInt((i==0)?(i+1):i); list.get(id); } return System.currentTimeMillis()-start; } static List addList(List list){ Object o = new Object(); for(int i=0;i<N;i++) { int id = (int) new java.util.Random().nextInt((i==0)?(i+1):i); list.add(id, o); } return list; } static long removeList(List list){ list=addList(list); long start=System.currentTimeMillis(); for(int i=0;i<N;i++) { int id = (int) new java.util.Random().nextInt((N-i)==0?(1):N-i); list.remove(id); } return System.currentTimeMillis()-start; } public static void main(String[] args) { System.out.println("ArrayList添加"+N+"条耗时:"+timeList(new ArrayList())); System.out.println("LinkedList添加"+N+"条耗时:"+timeList(new LinkedList())); List list1=addList(new ArrayList<>()); List list2=addList(new LinkedList<>()); System.out.println("ArrayList查找"+N+"条耗时:"+readList(list1)); System.out.println("LinkedList查找"+N+"条耗时:"+readList(list2)); System.out.println("ArrayList删除"+N+"条耗时:"+removeList(new ArrayList())); System.out.println("LinkedList删除"+N+"条耗时:"+removeList(new LinkedList())); } }
测试结果
100000条 ArrayList添加100000条耗时:1719 LinkedList添加100000条耗时:56433 ArrayList查找100000条耗时:22 LinkedList查找100000条耗时:4968 ArrayList删除100000条耗时:641 LinkedList删除100000条耗时:571215000条 ArrayList添加5000条耗时:25 LinkedList添加5000条耗时:77 ArrayList查找5000条耗时:5 LinkedList查找5000条耗时:136 ArrayList删除5000条耗时:13 LinkedList删除5000条耗时:62
当然,这里random会耗费一些时间,但这对两者是相等的,所以可以忽略。
以上的测试结果,似乎总是支持AL比LL的各方面都要好。
所以在这里大家可以探讨下这个问题:
是
AL易于查找;有频繁的插入、删除使用AL不合适,因涉及到其他元素左右移动问题;
LL不易于查找;有频繁的插入、删除操作使用LL比较合适,因只涉及修改前后连接;
还是
AL比LL的各方面都要好。
相关文章推荐
- 关于ArrayList和LinkedList的插入,遍历,删除时间比照
- Java学习之为什么说LinkedList的插入和删除性能比ArrayList好,而ArrayList的查询更好?
- 跳表(Skip List)的介绍以及查找插入删除等操作
- Java使用Arrays、ArrayList、LinkedList、Vector实现插入查询性能分析
- LinkedList,ArrayList末尾插入谁效率高?
- LinkedList,ArrayList末尾插入谁效率高?
- LinkedList 的简单操作 :插入 删除 正序、逆序遍历
- 跳表(Skip List)的介绍以及查找插入删除等操作
- QLinkedList和std::forward_list(都是双向链表,不支持operator[],好处可能是插入和删除都比较快)
- 跳表(Skip List)的介绍以及查找插入删除等操作
- ArrayList与linkedlist插入效率分析
- 不断的向数组的中间插入数据,ArrayList和LinkedList哪个快
- 通过编码分别测试ArrayList 和 LinkedList 添加、删除对象时的耗时情况(精确到纳秒),并总结出以上两种集合的数据结构的不同之处。
- ArrayList和 LinkedList的存储查找的优缺点
- 关于LinkedList和ArrayList 插入元素的性能比较疑惑,知道的请指教......
- 【如何提高Java代码质量:频繁插入和删除时使用LinkedList 】
- LinkedList,ArrayList末尾插入谁效率高?
- 通过编码分别测试ArrayList 和 LinkedList 添加、删除对象时的耗时情况(精确到纳秒),并总结出以上两种集合的数据结构的不同之处。
- [改善Java代码]频繁插入和删除时使用LinkedList
- python 中 list 列表 的十种操作方法:添加,插入,弹出,删除,延长,运算,查找,排序,反转,采用递归函数深度遍历list