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

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


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

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

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

 

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

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

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

 

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

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

 

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

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

在数据量1W的时候for循环

在数据量10W的时候

首先无论怎样 能够看到for 循环 linkedList时能够看到效率极慢,因此你们必定注意这点

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

而后能够看到在数据量10W以前foreach的效率比for循环效率略高

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

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

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

那为何会这样呢,究其缘由我以为是ArrayList对随机访问效率高

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