嘿,看过来,你不知道的双层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次

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

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

相关文章
相关标签/搜索