博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解析ArrayList与LinkedList的遍历方法
阅读量:4515 次
发布时间:2019-06-08

本文共 2822 字,大约阅读时间需要 9 分钟。

ArrayList与LinkedList都是实现List接口,前者底层是数据存储,而LinkedList则是以链表的形式存储,因此两个都各有其独自的特性。在两者中,遍历方法也随着改变而有所不同。

遍历方法

通用的List的遍历方法有三种:

1、for get循环遍历

2、foreach遍历

3、for Iterator迭代遍历

遍历结果

arrayList length: 360000

linkedList length: 360000

First: for get

arrayList need time: 15ms

linkedList need time: 239653ms

Second: foreach

arrayList need time: 22ms

linkedList need time: 20ms

Thrid: foreach itertor

arrayList need time: 17 ms

linkedList need time: 8 ms

这是在三十六万条数据下的结果。可以得出一个初步结论,linkedList使用get方法的效率极低,而linkedList使用foreach和itertor的表现是优于arraylist的。如果再把数据扩大十倍,让数据达到三百六十万条数据,在该情况下的速度结构更加体现了两者在不同遍历方法下的区别。

源码分析

ArrayList get:

public E get(int index) {    rangeCheck(index); //越界检查    return elementData(index);}

因为ArrayList存储为数组存储,所以可以直接用下表来访问,速度极快。

LinkedList get:

public E get(int index) {    checkElementIndex(index);    return node(index).item;}Node
node(int index) { // assert isElementIndex(index); if (index < (size >> 1)) { Node
x = first; for (int i = 0; i < index; i++) x = x.next; return x; } else { Node
x = last; for (int i = size - 1; i > index; i--) x = x.prev; return x; }}

LinkedList存储为Node,也就是双向链表方式存储,虽然两头都可以进行遍历,但是每次都要重复进行从头遍历元素,效率自然就慢了。

而foreach和迭代器方式两者的区别不大。

总结

1、ArrayList使用Get来遍历元素;Linkedlist多用foreach或迭代器方式遍历。

2、java开发当中为了能够尽可能的挖掘优化的点,应当对代码中的结构有深刻的理解,了解其中的构造,那么自然能够优化出速度快优美的代码。

附:遍历代码

public static void main(String[] args) throws Exception{    ArrayList
arrayList = new ArrayList
(); LinkedList
linkedList = new LinkedList
(); int num = 360000; Random random = new Random(); String randomStr = ""; for (int i = 0; i < num; i++){ randomStr = String.valueOf(random.nextFloat()); arrayList.add(randomStr); linkedList.add(randomStr); } System.out.println("------------------"); System.out.println("arrayList length: "+arrayList.size()); System.out.println("linkedList length: "+linkedList.size()); System.out.println("------------------"); System.out.println("------The way------"); System.out.println("First: for get"); long time1 = System.currentTimeMillis(); for (int i =0;i
iterator1 = arrayList.iterator(); while ( iterator1.hasNext()) { String t = iterator1.next(); } long time6 = System.currentTimeMillis(); System.out.println("arrayList need time: "+(time6-time5)+" ms"); long time55 = System.currentTimeMillis(); Iterator
iterator2 = linkedList.iterator(); while ( iterator2.hasNext()) { String t = iterator2.next(); } long time66 = System.currentTimeMillis(); System.out.println("linkedList need time: "+(time66-time55)+" ms");}//main

转载于:https://www.cnblogs.com/ITflying/p/7261764.html

你可能感兴趣的文章
论文网站相关链接
查看>>
死锁,死锁必要条件及处理策略
查看>>
Kinect for windows
查看>>
Java EE Map
查看>>
Hadoop源代码点滴-文件系统HDFS
查看>>
单个页面Request编码方式的改变,无需改动Web.config~
查看>>
SQL Server中的窗口函数
查看>>
【Alpha】Daily Scrum Meeting第十次
查看>>
戴尔Inspiron N4120 笔记本电脑安装XP、win7双系统过程
查看>>
Android 适配知识点
查看>>
Android中常用的几种加密
查看>>
50.Android编码规范
查看>>
linux下source命令的基本功能
查看>>
linux-IO重定向-文本流重定向
查看>>
MSSQLSERVER服务无法启动的解决方案
查看>>
MySQL数据库管理
查看>>
ASP.NET中进度条的简单应用
查看>>
Java Activiti6.0 spring5 SSM 工作流引擎 审批流程 java项目框架
查看>>
md5
查看>>
Linux下的crontab定时执行任务命令详解
查看>>