想必你们都常常用双层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次
最后发现,只改变一个数组的循环并不能改变循环次数。只有同时改变两个数组的顺序才能改变循环次数。
今天在一次业务开发中,遇到这个问题,在此记下来,为后面的开发作个警示