ArrayList与LinkedList的普通for循环遍历
2016-03-21 15:55
471 查看
public static void main(String[] args) { List<Integer> arrayList = new ArrayList<Integer>(); List<Integer> linkedList = new LinkedList<Integer>(); for (int i = 0; i < 1000; i++) { arrayList.add(i); linkedList.add(i); } long startTime = System.currentTimeMillis(); for (int i = 0; i < arrayList.size(); i++) { arrayList.get(i); } System.out.println("ArrayList遍历速度:" + (System.currentTimeMillis() - startTime) + "ms"); startTime = System.currentTimeMillis(); for (int i = 0; i < linkedList.size(); i++) { linkedList.get(i); } System.out.println("LinkedList遍历速度:" + (System.currentTimeMillis() - startTime) + "ms"); } 由于LinkedList是双向链表,因此第6行的意思是算出i在一半前还是一半后,一半前正序遍历、一半后倒序遍历,这样会快很多,当然,先不管这个,分析一下为什么使用普通for循环遍历LinkedList会这么慢。 原因就在第7~第8行,第10~第11行的两个for循里面,以前者为例: 1、get(0),直接拿到0位的Node0的地址,拿到Node0里面的数据 2、get(1),直接拿到0位的Node0的地址,从0位的Node0中找到下一个1位的Node1的地址,找到Node1,拿到Node1里面的数据 3、get(2),直接拿到0位的Node0的地址,从0位的Node0中找到下一个1位的Node1的地址,找到Node1,从1位的Node1中找到下一个2位的Node2的地址,找到Node2,拿到Node2里面的数据。 后面的以此类推。 也就是说,LinkedList在get任何一个位置的数据的时候,都会把前面的数据走一遍。假如我有10个数据,那么将要查询1+2+3+4+5+5+4+3+2+1=30次数据,相比ArrayList,却只需要查询10次数据就行了,随着LinkedList的容量越大,差距会越拉越大。其实使用LinkedList到底要查询多少次数据,大家应该已经很明白了,来算一下:按照前一半算应该是(1 + 0.5N) * 0.5N / 2,后一半算上即乘以2,应该是(1 + 0.5N) * 0.5N = 0.25N2 + 0.5N,忽略低阶项和首项系数,得出结论,LinikedList遍历的时间复杂度为O(N2)[b],N为LinkedList的容量[/b]。
相关文章推荐
- mysql 清除密码
- struts2 <s:iterator> status属性
- activeMQ连接池的配置(以及流程图)
- QT5.6.0 和 vs2013 联合编程
- Activity四种启动模式说明
- shell if 判断
- 把微博關注的主頁網址存下來
- 正则替换字符
- java集合-ArrayList的实现原理
- 3数组的队列方法
- C#初学
- 让WebApi支持Namespace
- scanf与getchar
- 23.Merge k Sorted Lists
- SDAU 课程练习2 1001
- IP验证
- viewpager的应用入门
- 拓展Markdown使文章丰富多彩
- 客户端发送请求参数的方式:get方式和post方式的区别
- 转:百度手机地图网络性能优化实践