1. 程式人生 > >Java基礎——foreach與正常for迴圈效率對比

Java基礎——foreach與正常for迴圈效率對比

在Java中對於集合的遍歷,一般有以下三種方法:

  1. for迴圈
  2. foreach迴圈
  3. 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低。