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