什么时候使用普通for循环,什么时候使用增强for循环
首先,增强for循环的写法比普通for循环简便,不过我们还得考虑效率。
--->首先,我们先看结论:
对于基本数组类的遍历,两者的效率是相同的;
对于ArrayList的遍历,普通for循环的效率高于增强for循环;
对于LinkedList的遍历,增强for循环的效率高于普通for循环。
--->然后,我们来看验证:
int[] intArray = new int[100000];
List<Integer> intArrayList = new ArrayList<>();
List<Integer> intLinkedList = new LinkedList<>();
for (int i = 0; i < 100000; i++) {
intArray[i] = i;
intArrayList.add(i);
intLinkedList.add(i);
}
int a = 0;
System.out.println("======遍历stringArray======");
//用for循环stringArray
long forStartTime = System.currentTimeMillis();
for (int i = 0; i < intArray.length; i++) {
a = intArray[i];
}
long forEndTime = System.currentTimeMillis();
System.out.println("普通for循环需要:" + (forEndTime - forStartTime) + "毫秒");
//用增强for循环stringArray
long forUpStartTime = System.currentTimeMillis();
for (Integer i: intArray) {
a = i;
}
long forUpEndTime = System.currentTimeMillis();
System.out.println("增强for循环需要:" + (forUpEndTime - forUpStartTime) + "毫秒");
System.out.println("======遍历stringArrayList======");
//用for循环stringArrayList
long forStartTime2 = System.currentTimeMillis();
for (int i = 0; i < intArrayList.size(); i++) {
a = intArrayList.get(i);
}
long forEndTime2 = System.currentTimeMillis();
System.out.println("普通for循环需要:" + (forEndTime2 - forStartTime2) + "毫秒");
//用增强for循环stringArrayList
long forUpStartTime2 = System.currentTimeMillis();
for (Integer i: intArrayList) {
a = i;
}
long forUpEndTime2 = System.currentTimeMillis();
System.out.println("增强for循环需要:" + (forUpEndTime2 - forUpStartTime2) + "毫秒");
System.out.println("======遍历stringLinkedList======");
//用for循环stringLinkedList
long forStartTime3 = System.currentTimeMillis();
for (int i = 0; i < intLinkedList.size(); i++) {
a = intLinkedList.get(i);
}
long forEndTime3 = System.currentTimeMillis();
System.out.println("普通for循环需要:" + (forEndTime3 - forStartTime3) + "毫秒");
//用增强for循环stringLinkedList
long forUpStartTime3 = System.currentTimeMillis();
for (Integer i: intLinkedList) {
a = i;
}
long forUpEndTime3 = System.currentTimeMillis();
System.out.println("增强for循环需要:" + (forUpEndTime3 - forUpStartTime3) + "毫秒");
I/System.out: ======遍历stringArray======
I/System.out: 普通for循环需要:1毫秒
I/System.out: 增强for循环需要:1毫秒
I/System.out: ======遍历stringArrayList======
I/System.out: 普通for循环需要:2毫秒
I/System.out: 增强for循环需要:2毫秒
I/System.out: ======遍历stringLinkedList======
I/System.out: 普通for循环需要:4411毫秒
I/System.out: 增强for循环需要:6毫秒
可以佐证上述结论。
并且我们尤其需要关注:
使用LinkedList时,普通for循环比增强for循环花费的时间要多很多,甚至会导致程序直接卡死。
写在最后:
ArrayList是采用数组的形式保存对象的,这种方式将对象放在连续的内存块中,所以插入和删除时比较麻烦,
查询比较方便。
LinkedList是将对象放在独立的空间中,而且每个空间中还保留下一个空间的索引,也就是数据结构中的链表结构,
插入和删除比较方便,但是查找很麻烦,要从第一个开始遍历。
至于为什么使用LinkedList时,普通for循环耗时比增强for循环多那么多,这是因为他们的实现不同,具体可以参考