Java基礎——foreach與正常for迴圈效率對比
阿新 • • 發佈:2019-01-05
在Java中對於集合的遍歷,一般有以下三種方法:
- for迴圈
- foreach迴圈
- Iterator遍歷
下面來分析一下for迴圈和foreach迴圈的效率對比以及簡單分析一下原因。
看下面的程式碼:
public class ForTest {
public static void testArrayList(ArrayList<Integer> arrayList) {
System.out.println("測試ArrayList for");
long starTime = System.currentTimeMillis();
for (int i =0;i<arrayList.size();i++) {
int x = arrayList.get(i);
}
long endTime = System.currentTimeMillis();
System.out.println("時間是:"+(endTime - starTime));
System.out.println("測試ArrayList foreach");
long starTime1 = System.currentTimeMillis();
for (int i: arrayList) {
int y = i;
}
long endTime1 = System.currentTimeMillis();
System.out.println("時間是:"+(endTime1 - starTime1));
}
public static void testLinkedList(LinkedList<Integer> linkedList) {
System.out.println("測試linkedList for");
long starTime = System.currentTimeMillis();
for(int i =0;i<linkedList.size();i++) {
int x = linkedList.get(i);
}
long endTime = System.currentTimeMillis();
System.out.println("時間是:"+(endTime - starTime));
System.out.println("測試linkedList foreach");
long starTime1 = System.currentTimeMillis();
for(int i: linkedList) {
int y = i;
}
long endTime1 = System.currentTimeMillis();
System.out.println("時間是:"+(endTime1 - starTime1));
}
public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList<>();
LinkedList<Integer> linkedList = new LinkedList<>();
for(int i =0;i<100000;i++) {
arrayList.add(i);
linkedList.add(i);
}
testArrayList(arrayList);
testLinkedList(linkedList);
}
}
對比如下:
測試ArrayList for
時間是:6
測試ArrayList foreach
時間是:5
測試linkedList for
時間是:4515
測試linkedList foreach
時間是:2
從以上答案分析出ArrayList中for和foreach迴圈效率差不多,但是LinkedList中for迴圈效率明顯比foreach迴圈效率低很多。
分析位元組碼:
從位元組碼中可以看出:對於for迴圈就是呼叫get(i)取得元素,而對於foreach是通過iterator實現的遍歷,上述結果產生的原因主要是因為不同的資料結構產生的。
對於ArrayList來說,它是通過一個數組實現的,可以隨機存取;但是LinkedList是通過連結串列實現的,for迴圈時要獲取第i個元素必須從頭開始遍歷,而iterator遍歷就是從頭開始遍歷,遍歷完只需要一次,所以for迴圈需要的時間遠遠超過for迴圈。
總結:
對於陣列來說,for和foreach迴圈效率差不多,但是對於連結串列來說,for迴圈效率明顯比foreach低。