近期在做一个对接京东的电商平台,所以对各个地方的效率考虑的比较多,今天深挖了一下ArrayList与LinkedList的区别以及对应List使用foreach与使用下标遍历的效率问题,首先说一下两种List的区别。


ArrayList是基于动态数组的数据结构,而LinkedList基于链表的数据结构

从根本上考虑,数组在物理地址上是连续的,而链表使用指针将各个元素串起来

那么基于两种List的数据结构,可以判断出在对数据进行查找时ArrayList比LinkedList效率高,因为数组结构的遍历只需将下标加一,而链表结构则需要获取下一节点的地址将指针移动到下一节点,而在对元素进行增删时LinedList会比ArrayList好用,链表结构可以很轻松的在链表中间去增删元素,而不需要改变插入节点后面元素的任何数据,但数组结构如果要在数组中间插入元素那么需要改变插入后元素的下标,但如果是在List最后加入元素那么效率上差距不大。

好了说完两种List再来说一下foreach与下标遍历的区别,直接上例子

这是java 文件中编写的foreach循环

for(Object obj : list){
System.out.println(obj);
}

对java文件编译后的class文件进行反编译得

for(java.util.Iterator i$ = list.iterator(); i$.hasNext();)
{
String s = (String) i$.next();
{
System.out.println(s);
}
}

结果显示,其实foreach其实和for在语法上没有任何区别,唯一的区别是foreach使用了迭代器

而效率问题下面直接给出测试结果:分别在for循环与foreach循环下arrayList与linkedList的效率

在数据量1W的时候

在数据量10W的时候

首先不管怎样 可以看到for 循环 linkedList时可以看到效率极慢,所以大家一定注意这点

再是随着数据量的提升linkedList运行时间乘级上升,所以注意在数据量大的是一定要避免使用linkedList

然后可以看到在数据量10W之前foreach的效率比for循环效率略高

抱着怀疑的态度对1000W的循环量进行了测试结果如下

结果却是循环下标比foreach快,为了排除偶然因素再测一遍

确认foreach在数据量比较大的情况下比下标循环要慢

那为什么会这样呢,究其原因我觉得是ArrayList对随机访问效率高

这样使用下标访问效率本身很高.foreach内部封装了几个对下标的方法,所以自己for比foreach更直接,所以数据量大的时候效率稍高些,但差别不会太大,仍然在一个数量级上

JAVA中ArrayList与LinkedList的区别以及对应List使用foreach与使用下标遍历的效率问题的更多相关文章

  1. Java中ArrayList与LinkedList的区别

    Java中ArrayList与LinkedList的区别 一般大家都知道ArrayList和LinkedList的区别: 1. ArrayList的实现是基于数组,LinkedList的实现是基于双向 ...

  2. java中ArrayList 和 LinkedList 有什么区别

    转: java中ArrayList 和 LinkedList 有什么区别 ArrayList和LinkedList都实现了List接口,有以下的不同点:1.ArrayList是基于索引的数据接口,它的 ...

  3. Java中arraylist和linkedlist源代码分析与性能比較

    Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arra ...

  4. Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度

    一般大家都知道ArrayList和LinkedList的大致区别:      1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.      2.对于随机访问 ...

  5. Java中ArrayList和LinkedList区别

    ArrayList和LinkedList的大致区别如下:1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayLis ...

  6. Java中ArrayList和LinkedList区别、ArrayList和Vector的区别

    一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,Ar ...

  7. java中ArrayList、LinkedList、Vector的区别

    ArrayList.LinkedList.Vector这三个类都实现了List接口. ArrayList是一个可以处理变长数组的类型,可以存放任意类型的对象.ArrayList的所有方法都是默认在单一 ...

  8. Java基础-ArrayList和LinkedList的区别

    大致区别:  1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为Lin ...

  9. Java中ArrayList和LinkedList差别

    一般大家都知道ArrayList和LinkedList的大致差别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.  2.对于随机訪问get和set.A ...

随机推荐

  1. Spring 框架下 事务的配置(复杂)

    //db.properties配置  src下的文件 jdbc.jdbcUrl=jdbc:mysql:///day43jdbc.driverClass=com.mysql.jdbc.Driverjdb ...

  2. SpringMVC Controller中注入Request成员域和在方法中定义中HttpServletRequest有啥区别

    先说结论,在Controller中注入Request是线程安全的. 以下是解释: 我们先来看看这两者有什么不同 在controller注入成员变量request 可以看到注入的是一个代理对象 写在方法 ...

  3. sqlserver 通过日志恢复误删的数据

    转载地址:https://www.cnblogs.com/mrzl/p/4043313.html

  4. vector容器用法详解

    vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组.像数组一样,vector类也用从0开始的下标表示元素的位置:但和数组不同的是,当vector对象创建后,数组的元素个数会随着ve ...

  5. 【并发编程】IO模型

    一.要点回顾 为了更好地了解IO模型,我们需要先回顾下几个概念:同步.异步.阻塞.非阻塞 同步: 一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行.就是在发出一个功能调用时,在没 ...

  6. nginx图解

    1.Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理. 这里我给来2张图,对正向代理与反响代理做个诠释,具体细节,大家可以翻阅下资料. Nginx在做反向代理时,提供性能稳定, ...

  7. 201771010142 张燕《面向对象程序设计(java)》第一周学习总结

    201771010142 张燕<面向对象程序设计(java)>第一周学习总结 第一部分:课程准备部分 填写课程学习 平台注册账号, 平台名称 注册账号 博客园:www.cnblogs.co ...

  8. ABP框架系列之三十七:(Navigation-导航)

    Every web application has some menu to navigate between pages/screens. ASP.NET Boilerplate provides ...

  9. 基于ESP32的uart通讯

    本文源码地址为:http://download.csdn.net/download/noticeable/9961054 ESP32上有三个UART通讯接口,设备号,从0~2,即UART0,UART1 ...

  10. 带权单源最短路[稀疏图](Dijkstra)

    因为是稀疏图,所以应当选择邻接表来存储 构造一个邻接表 这只是我的构造方法,有很多种更好的构造方法,大家可以自己去构造 typedef int vertex; typedef int WeightTy ...