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

时间:2023-03-08 16:59:09
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的时候

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

在数据量10W的时候

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

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

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

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

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

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

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

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

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

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

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