什麼時候使用普通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循環多那麼多,這是因爲他們的實現不同,具體可以參考