近期在做一个对接京东的电商平台,所以对各个地方的效率考虑的比较多,今天深挖了一下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. 分布式协议学习笔记(三) Raft 选举自编写代码练习

    由于时间安排上的原因,这次的代码写的稍微有些简略,只能算是自己对RAFT协议的一个巩固. 实现定义2个节点,使用读取配置文件来获取IP和端口以及节点ID 网络使用boost同步流程 一个线程收 一个线 ...

  2. python之模块调用

    1.以 atm_run 为入口,在atm中的main模块调用config中的settings from config import settings 2.以atm_run为入口,在main中调用log ...

  3. 图解HTTP第二章

    简单的 HTTP 协议 1>HTTP 协议用于客户端和服务器端之间的通信 HTTP 协议和 TCP/IP 协议族内的其他众多的协议相同,用于客户端和服务器之间的通信.请求访问文本或图像等资源的一 ...

  4. MySQL安装及后续配置

    rpm -qa | grep mysql  检查已安装的mysql版本 rpm -e --nodeps mysql-libs-5.1.71 卸载 tar -zxvf MySQL.tar.gz 解压 安 ...

  5. 移动端web兼容各种分辨率写法

    移动端web开发最好用rem单位,再设置以下js,以iphone6 750*1334为基准 <script> var size = document.documentElement.cli ...

  6. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax;问题的解决

    哇,时隔两天时间,终于找到这个问题的解决办法,先看问题 这是我最近写的家庭记账本网页版,按顺序输入点击保存,总是弹出添加失败的提示 顺着找原因,把原因锁定在dao层的sql语句上,反复检查,没有找到一 ...

  7. jxl操作excel写入数据不覆盖原有数据示例

    public void readTO() {        Workbook wb = null;        WritableWorkbook wwb = null;        try {   ...

  8. vi分屏指令

    用vi打开,view打开vsplit不支持 命令模式下::new,新建文件并分屏, 快捷键,Ctrl+W,然后马上按n键:spilt 水平分屏,将当前屏分为两个,水平的.   Ctrl + w, s: ...

  9. Python语言中的按位运算

    (转)位操作是程序设计中对位模式或二进制数的一元和二元操作. 在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多. 在现代架构中, 情况并非如此:位运算的运算速度通常与加 ...

  10. 背水一战 Windows 10 (74) - 控件(控件基类): UIElement - 与 CanDrag 相关的事件, 与 AllowDrop 相关的事件

    [源码下载] 背水一战 Windows 10 (74) - 控件(控件基类): UIElement - 与 CanDrag 相关的事件, 与 AllowDrop 相关的事件 作者:webabcd 介绍 ...