1. 前言
同事问了一个面试人员的面试题,for循环与foreach循环哪个遍历数组更快? 面试人员没有回答出来,我们就此来分析一下,到底哪个更快。 以及为什么更快,数组之间的区别有哪些。
2. for循环与foreach循环哪个遍历数组更快
先搞一段代码来看
public static void main(String[] args) {
// 创建两个list数组,一个为arrayList,一个为linkedList
List<String> stringLinkedList = new LinkedList<String>();
List<String> stringArrayList = new ArrayList<String>();
// 插入10w条数据
for (int i = 0; i < 100000; i++) {
stringLinkedList.add(String.valueOf(i));
stringArrayList.add(String.valueOf(i));
}
String hhh = null;
// 1、用for循环遍历ArrayList
long forArrayMillis = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
hhh = stringArrayList.get(i);
}
System.err.println("用for循环遍历ArrayList,耗时:" + String.valueOf(System.currentTimeMillis() - forArrayMillis) + " ms");
// 2、用foreach循环遍历ArrayList
long foreachArrayMillis = System.currentTimeMillis();
for (String string : stringArrayList) {
hhh = string;
}
System.err.println("用foreach循环遍历ArrayList,耗时:" + String.valueOf(System.currentTimeMillis() - foreachArrayMillis) + " ms");
// 3、用for循环遍历LinkedList
long forLinkedMillis = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
hhh = stringLinkedList.get(i);
}
System.err.println("用for循环遍历LinkedList,耗时:" + String.valueOf(System.currentTimeMillis() - forLinkedMillis) + " ms");
// 4、用foreach循环遍历LinkedList
long foreachLinkedMillis = System.currentTimeMillis();
for (String string : stringLinkedList) {
hhh = string;
}
System.err.println("用foreach循环遍历LinkedList,耗时:" + String.valueOf(System.currentTimeMillis() - foreachLinkedMillis) + " ms");
}
输出结果
用for循环遍历ArrayList,耗时:2 ms
用foreach循环遍历ArrayList,耗时:3 ms
用for循环遍历LinkedList,耗时:16215 ms
用foreach循环遍历LinkedList,耗时:4 ms
这样来看,
在循环ArrayList时,10W条数据,相差并不大,但是相比较来说,还是for循环更快一些。多运行几次,相差时间可以达到2ms(for循环),4ms(foreach循环)。
在循环LinkedList时,明显可以看出来foreach更快,耗时相差较大。
3. 为什么会出现这种情况?
首先,我们来分析一下源码,可能太长,大家可以快速翻阅的看。
<