我们知道For循环在Java中经常被使用,下面我们来看一下这个for的一些细节运行。
例子一:
1
2
3
|
for
(
int
i=
10
;i>
0
;i--){
System.out.print(
" "
+i);
}
|
输出如下: 10 9 8 7 6 5 4 3 2 1
我们一步一步跟踪一下这个for循环:
1:初始化i=10(在这个for循环之中只会执行一次,只在循环开始时候执行一次)
2:判断(i>0)是否成立,显然10>0成立,执行循环体,再次就是打印一下i的值。
3:执行i--操作,执行完之后i=9;
4:再次判断i>0是否成立,成立的话继续执行循环体,都则跳出循环。这里i=1>0显然成立,于是继续执行循环。。。。。
。。。。。。。依次输出9,8,7,6,5,4,3,2,1
5:当输出完1之后可以知道此时i=1,然后执行i--操作,减完之后i=0。
6:再次判断i>0是否成立,显然i=0>0不成了,于是跳出循环。至此for循环结束。
这里我们可以看一下一共执行了20次判断,而循环体执行了10次,i--也执行了10次,所以在这种简单情况下循环体执行的次数可以设为n,则判断的的次数为2n次。
例子二:
1
2
3
|
for
(
int
i=
10
;i-->
0
;){
System.out.print(
" "
+i);
}
|
输出如下: 9 8 7 6 5 4 3 2 1 0
在这里我们进行的与例子一稍微有点差别,这里的差距体现在i-->0上,下面让我仔细对比:
1:初始化i=10(在这个for循环之中只会执行一次,只在循环开始时候执行一次)
2:执行i--操作,执行完之后i=10;
3:判断(i>0)是否成立,显然9>0成立,执行循环体,打印一下i的值(9)。(2,3步其实是统一的,再次拆开只是为了方便大家理解)
4:再次执行i--操作,执行完之后i=9
5:判断(i>0)是否成立,显然9>0成立,执行循环体,打印一下i的值(8)。.。。。。。。。
依次打印的结果为:9,8,7,6,5,4,3,2,1,
6:然后我们注意这一次了,因为是i-->0所以虽然这时候i--执行了,但是判断的时候这里的i=1>0扔成立。
7:在执行输出的时候因为上面执行过了i--操作了所以这里输出的是0而不是1;
有兴趣的可以去测试--i>0时候的效果
这里我们可以看一下一共执行了11次判断,而循环体执行了10次,i--也执行了11次,所以在这种简单情况下循环体执行的次数可以设为n,则判断的的次数为n+1次。
在这里我测试使用i=1000分别测试两次执行的时间,前者的平均执行时间是85ms,后者的平均执行时间70ms,而我将循环次数上升到1000次时候前者的平均时间是621ms,后者的平均时间是844ms。粗略统计情况可知道在循环次数多的情况下使用前者的情况下效率会更多一点。所以笔者个人建议使用前者。
例子三:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
int
i =
0
;
outer:
for
(;
true
;) {
inner:
for
(; i <
10
; i++) {
System.out.println(
"i = "
+ i);
if
(i ==
2
) {
System.out.println(
"continue"
);
continue
;
}
if
(i ==
3
) {
System.out.println(
"break"
);
i++;
break
;
}
if
(i ==
7
) {
System.out.println(
"continue outer"
);
i++;
continue
outer;
}
if
(i ==
8
) {
System.out.println(
"break outer"
);
break
outer;
}
for
(
int
k =
0
; k <
5
; k++) {
if
(k ==
3
) {
System.out.println(
"continue inner"
);
continue
inner;
}
}
}
}
}
|
输出结果如下:
i = 0
continue inner
i = 1
continue inner
i = 2
continue
i = 3
break
i = 4
continue inner
i = 5
continue inner
i = 6
continue inner
i = 7
continue outer
i = 8
break outer
现在我们一步一步看看这个循环,相信如果耐心看完之后你对break和continue的理解会更充分。
1:首先是i的值默认为0,温馨提示(这里的i及时不赋值的话系统也会自动赋值为0的)。
2:进入了outer循环,之类outer:后面不能加任何其他字符
3:进入for循环了,因为已经有i的初始值,所for循环以第一项可以省略啦.
4:判断0<10成立,只是开始执行喽。首先输出i=10,然后执行下面的for循环输出"continue inner"
5:continue inner--------返回inner循环体开始的部分这时候及时continue之后还有语句的话也会结束的。
插插插:continue之后不加任何字符的话就是说本次for循环执行结束而已,而不会调到外面的循环体之中,
但是加了inner之后就明确指定跳转到了inner循环的部分了。
6:进入inner部分,第一步进入for循环然后输出i=1,接下来跟上面步骤一样,重复一次。
7:再次进入inner部分,第一步再次进入for循环,输出i=2.
计入第一个if循环,输出continue字符串,然后执行continue。注意这里的continue与上面的区别。
8:执行完7之后就直接再次调到for循环开头了,输出i=3.
9:进入第二个if循环,输出“break”.然后执行break语句
10:执行完break之后直接结束了本次的for循环语句,及时这个时候i=3<10仍然成立,但是这就是break的作用了。
11:跳转到最大的for循环:for(; true ;),然后依次再次进入inner,小for循环。。。duang,duang,duang。。。。
12:执行小for循环输i=7,执行第三个if判断,输出continue outer并且i++,注意之类如果没有i++的话将会进入无线循环哦。
13:由于执行了continue outer操作所以其实这个跟上一次的break回到的位置是一样的,都是外层的out块.
14:依次执行,输出i=8;进入第四个for循环,输出“break outer”,执行break outer(跳出最外层的outer块).整个大块结束。
综上简单更了一下for循环里面一些基本知识,之后会陆续更新基础的知识,如果有读者想建议笔者更新其他内容了可以联系笔者哦:425804471@qq.com