想必你們都常常用雙層FOR遍歷,那麼你是否發現下面這些問題呢?數組
首先咱們來看下面的循環bash
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次。那麼咱們帶着個循環作下面的操做ui
咱們再來看數組循環spa
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次
}
}
複製代碼
與這個作對比code
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次
}
}複製代碼
看到這裏,你是否是以爲我上面在講廢話?開發
好吧,進入正題,但願耽擱你的時間很少。string
咱們在實際應用場景中不單單是雙層循環一下就完了:好比咱們要進行數據比對class
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次
最後發現,只改變一個數組的循環並不能改變循環次數。只有同時改變兩個數組的順序才能改變循環次數。
今天在一次業務開發中,遇到這個問題,在此記下來,爲後面的開發作個警示