1. 程式人生 > >Think In Java 第四章 控制執行流程

Think In Java 第四章 控制執行流程

?普通for迴圈在遍歷集合時使用下標來定位集合中的元素,java在jdk1.5中開始支援foreach迴圈,foreach在一定程度上簡化了對集合的遍歷,在遍歷陣列、集合的時候,foreach擁有不錯的效能。但是foreach不能完全代替for迴圈。foreach限制場景有以下4點:

(1)使用foreach來遍歷集合時,集合必須實現Iterator介面,foreach就是使用Iterator介面來實現對集合的遍歷的;
(2)在用foreach迴圈遍歷一個集合時不能向集合中增加元素,不能從集合中刪除元素,否則會丟擲ConcurrentModificationException異常。丟擲該異常是因為在集合內部有一個modCount變數用於記錄集合中元素的個數,當向集合中增加或刪除元素時,modCount也會隨之變化,在遍歷開始時會記錄modCount的值,每次遍歷元素時都會判斷該變數是否發生了變化,如果發生了變化則丟擲ConcurrentModificationException異常;
(3)當使用foreach迴圈基本型別時變數時不能修改集合中的元素的值,遍歷物件時可以修改物件的屬性的值,但是不能修改物件的引用;
(4)當在遍歷時需要根據元素在集合中的index的時候不能使用foreach。

?帶標籤與不帶標籤的continue、break用於迭代語句時規則:
1.一般的continue會退回到最內層迴圈的開頭,並繼續執行迴圈。
帶標籤的continue會到標籤的位置,並重新進入緊接在那個標籤後面的迴圈。
2.一般的break會中斷並跳出當前迴圈。
3.帶標籤的break會中斷並跳出標籤所指的迴圈。

在Java裡需要使用標籤的唯一理由就是因為有迴圈巢狀存在,而且想從多層巢狀中break或continue到外層迴圈外。

標籤只能緊跟在迴圈語句前(注:如果中間還有其他語句,則continue與break語句編譯出錯,但如果標籤不應用到continue與break中,則不會有問題)

  public static void main(String args []){
        int i = 0, j = 0;
        outer:
        // !! 注,標籤的下面不能寫任何其他非迭代語句
        for (; i < 5; i++) { // 死迴圈
               inner:
               // !! 注,標籤的下面不能寫任何其他非迭代語句
               for (; j < 10; j++) {
                      System.out.println(("i=" + i + " j = "
+ j)); if (j == 2) { System.out.println("continue"); continue;// 回到內層迴圈起始處繼續執行內層迴圈,j會自動遞增 } if (j == 3) { System.out.println("break"); // 為了下次迴圈不再走該分支,則要使用i遞增1,因為break後j不會自動遞增 j++; break;// 跳出內層迴圈,回到外層迴圈起始處繼續執行外層迴圈 } if (j == 7) { System.out.println("continue outer"); // 由於帶標籤的continue跳到了外層迴圈起始處,所以j不會自動遞增,但為了 // 下一次不再走該分支,所以要手動遞增1 j++; continue outer; } if (j == 8) { System.out.println("break outer"); break outer;// 當j為8時,退出內外層迴圈,實質上執行最後列印語句 } for (int k = 0; k < 5; k++) { if (k == 3) { System.out.println("continue inner"); // j為0、1、4、5、6時分別會執行一遍 continue inner; } } } } // 由於 break outer 跳出,所以i不會遞增,最後還是2 System.out.println(("i = " + i)); } result: i=0 j = 0 continue inner i=0 j = 1 continue inner i=0 j = 2 continue i=0 j = 3 break i=1 j = 4 continue inner i=1 j = 5 continue inner i=1 j = 6 continue inner i=1 j = 7 continue outer i=2 j = 8 break outer i = 2