想必大家都經常用雙層FOR遍歷,那麼你是否發現下面這些問題呢?
一、普通迴圈
首先我們來看下面的迴圈
int k = 0;
for(int i = 0; i < 10; i++){
for(int j = 0; j < 6; j++){
System.out.println(k++);//迴圈60次
}
}
複製程式碼
與這個做對比
int k = 0;
for(int i = 0; i < 6; i++){
for(int j = 0; j < 10; j++){
System.out.println(k++);//迴圈60次
}
}
複製程式碼
都是迴圈了60次。那麼我們帶著個迴圈做下面的操作
二、陣列迴圈
我們再來看陣列迴圈
int[] a = {0,1,2,3,4,5,6,7,8,9};
int[] b = {0,1,2,3,4,5};
for(int i = 0; i < a.length; i++){
for(int j = 0; j < b.length; j++){
System.out.println(k++);//迴圈60次
}
}
複製程式碼
與這個做對比
int[] a = {0,1,2,3,4,5,6,7,8,9};
int[] b = {0,1,2,3,4,5};
for(int i = 0; i < b.length; i++){
for(int j = 0; j < a.length; j++){
System.out.println(k++);//迴圈60次
}
}複製程式碼
三、實際應用
看到這裡,你是不是覺得我上面在講廢話?
好吧,進入正題,希望耽擱你的時間不多。
我們在實際應用場景中不僅僅是雙層迴圈一下就完了:比如我們要進行資料比對
int k = 0;
int[] a = {0,1,2,3,4,5,6,7,8,9};
int[] b = {0,1,2,3,4,5};
for(int i = 0; i < a.length; i++){
for(int j = 0; j < b.length; j++){
if(a[i] == b[j]){
k++;
break;//結束本次迴圈
}
k++;
}
}
System.out.println("程式共迴圈" + k + "次");//
複製程式碼
在這次迴圈中我們判斷了外層資料與內層的資料是否相等,加入了break終止迴圈(避免無意義的)。
程式輸出:程式共迴圈45次
那麼我再看這一個程式:
int k = 0;
int[] b = {0,1,2,3,4,5,6,7,8,9};
int[] a = {0,1,2,3,4,5};
for(int i = 0; i < a.length; i++){
for(int j = 0; j < b.length; j++){
if(a[i] == b[j]){
k++;
break;//結束本次迴圈
}
k++;
}
}
System.out.println("程式共迴圈" + k + "次");
複製程式碼
注意a,b陣列的值對調了;
再看一下輸出:程式共迴圈21次
那麼問題就來了,如果我們不對調a,b的位置。我們把內層迴圈放到外層,效果也是一樣;
迴圈21次。
或許有人會說,這沒什麼。但是我們有沒有在實際程式碼編寫注意到這個問題呢。因為迴圈次數可是關係到程式效能
其實這裡為什麼會發生這麼大的差異:
int[] a = {0,1,2,3,4,5,6,7,8,9};
int[] b = {0,1,2,3,4,5};複製程式碼
這裡把b陣列放在外層,在內層迴圈的時候可以更快的找到與外層對應的值,經過break,差異就這麼發生了。
我們來改變b陣列值的順序,還是把b放到外層
int k = 0;
int[] a = {0,1,2,3,4,5,6,7,8,9};
int[] b = {5,1,2,3,4,0};
for(int i = 0; i < b.length; i++){
for(int j = 0; j < a.length; j++){
if(b[i] == a[j]){
k++;
break;//結束本次迴圈
}
k++;
}
}
System.out.println("程式共迴圈" + k + "次");
複製程式碼
程式輸出:程式共迴圈21次
尷尬。貌似換的順序不影響。我不服
int k = 0;
int[] a = {0,1,2,3,4,5,6,7,8,9};
int[] b = {5,2,4,3,1,0};
for(int i = 0; i < b.length; i++){
for(int j = 0; j < a.length; j++){
if(b[i] == a[j]){
k++;
break;//結束本次迴圈
}
k++;
}
}
System.out.println("程式共迴圈" + k + "次");複製程式碼
程式輸出:程式共迴圈21次
不對啊。再換
int k = 0;
int[] a = {0,1,2,3,4,5,6,7,8,9};
int[] b = {5,1,3,4,2,0};
for(int i = 0; i < b.length; i++){
for(int j = 0; j < a.length; j++){
if(b[i] == a[j]){
k++;
break;//結束本次迴圈
}
k++;
}
}
System.out.println("程式共迴圈" + k + "次");複製程式碼
程式輸出:程式共迴圈21次
最後發現,只改變一個陣列的迴圈並不能改變迴圈次數。只有同時改變兩個陣列的順序才能改變迴圈次數。
今天在一次業務開發中,遇到這個問題,在此記下來,為後面的開發做個警示