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