嘿,看過來,你不知道的雙層FOR循環的祕密

想必你們都常常用雙層FOR遍歷,那麼你是否發現下面這些問題呢?數組

1、普通循環

首先咱們來看下面的循環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

2、數組循環

咱們再來看數組循環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次
    }
}複製代碼

3、實際應用

看到這裏,你是否是以爲我上面在講廢話?開發

好吧,進入正題,但願耽擱你的時間很少。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次

最後發現,只改變一個數組的循環並不能改變循環次數。只有同時改變兩個數組的順序才能改變循環次數。

今天在一次業務開發中,遇到這個問題,在此記下來,爲後面的開發作個警示

相關文章
相關標籤/搜索