JAVA中ArrayList与LinkedList的区别以及对应List使用foreach与使用下标遍历的效率问题
近期在做一个对接京东的电商平台,所以对各个地方的效率考虑的比较多,今天深挖了一下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与使用下标遍历的效率问题的更多相关文章
- Java中ArrayList与LinkedList的区别
Java中ArrayList与LinkedList的区别 一般大家都知道ArrayList和LinkedList的区别: 1. ArrayList的实现是基于数组,LinkedList的实现是基于双向 ...
- java中ArrayList 和 LinkedList 有什么区别
转: java中ArrayList 和 LinkedList 有什么区别 ArrayList和LinkedList都实现了List接口,有以下的不同点:1.ArrayList是基于索引的数据接口,它的 ...
- Java中arraylist和linkedlist源代码分析与性能比較
Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arra ...
- Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度
一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问 ...
- Java中ArrayList和LinkedList区别
ArrayList和LinkedList的大致区别如下:1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayLis ...
- Java中ArrayList和LinkedList区别、ArrayList和Vector的区别
一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,Ar ...
- java中ArrayList、LinkedList、Vector的区别
ArrayList.LinkedList.Vector这三个类都实现了List接口. ArrayList是一个可以处理变长数组的类型,可以存放任意类型的对象.ArrayList的所有方法都是默认在单一 ...
- Java基础-ArrayList和LinkedList的区别
大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为Lin ...
- Java中ArrayList和LinkedList差别
一般大家都知道ArrayList和LinkedList的大致差别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机訪问get和set.A ...
随机推荐
- MyOD
一.实现目的: 编写MyOD.java 用java MyOD XXX实现Linux下od -tx -tc XXX的功能 二.功能简介 1.Linux下的od功能是将指定文件内容以八进制.十进制.十六进 ...
- linux 查看信息-系统&资源
系统 1.查看内核/操作系统/CPU信息 2.查看操作系统版本 3.查看CPU信息 4.查看计算机名 5.列出所有PCI设备 6.列出所有的USB设备 7.列出加载的内核模块 8.查看环境变量 资源 ...
- Linux - rename 批量替换两种模式
模式一: rename sub raw * 模式二: rename 's/sub/raw/g' * sub raw 这里支持一定程序的正则匹配
- [Machine Learning][The Analytics Edge][Predicting Earnings from Census Data]
census = read.csv("census.csv")library(caTools)set.seed(2000)spl = sample.split(census$ove ...
- canvas画圆环
<!DOCTYPE html><html> <head> <title> </title> <meta http-equiv=&quo ...
- C语言中,int型函数返回值可以为bool型。
参考:https://bbs.csdn.net/topics/360116265. 问题: 如一个函数如下: int aa( int a, int b ) //举个例子,不要纠结功能. { if(a ...
- centos7安装python3.6后导致防火墙功能无法正常工作的解决办法
问题:因为默认python版本被设置成了python3.6,而进行防火墙的指令操作频频报错. Jul 19 16:30:51 localhost.localdomain systemd[1]: Sta ...
- 准备在electron上用vue,结果卡在了sqlite3
vue.js看书有一段时间了,也准备动手做一个electron的程序.目录似乎有两种方式搭建方式 一种是使用vue.cli构建工具,就是所谓的脚手架,分别安装vue和electron https:// ...
- docker 容器和镜像理解
1.镜像是Docker容器的基石,容器是镜像的运行实例,有了镜像才能启动容器.容器和镜像是一对一的,一个容器里就运行一个镜像. 1.base镜像----提供了一个基本的操作系统环境,用户可以根据需要安 ...
- unidbgrid 设置 单元格颜色
unidbgrid 设置 单元格颜色 2018年10月24日 11:32:41 ozhy111 阅读数:68 procedure TF_Resource2.UniDBGrid1DrawColumn ...