嘿,看过来,你不知道的双层FOR循环的秘密

3,514 阅读3分钟

想必大家都经常用双层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次

最后发现,只改变一个数组的循环并不能改变循环次数。只有同时改变两个数组的顺序才能改变循环次数。

今天在一次业务开发中,遇到这个问题,在此记下来,为后面的开发做个警示