前言
Java 循环语句 for 与 while 的代码示例及字节码.
代码
Java for 循环代码
public class ForLoop {
public static void main(String[] args) {
common();
iter();
}
private static void common() {
for (var i = -1; i <= 1; i++) {
System.out.println(i);
}
}
private static void iter() {
var list = List.of(-1, 0, 1);
for (var i : list) {
System.out.println(i);
}
}
}
字节码
上述代码 common()
方法和 iter()
方法生成的字节码为:
// common
0 iconst_m1
1 istore_0
2 iload_0
3 iconst_1
4 if_icmpgt 20 (+16)
7 getstatic #15 <java/lang/System.out>
10 iload_0
11 invokevirtual #21 <java/io/PrintStream.println>
14 iinc 0 by 1
17 goto 2 (-15)
20 return
// iter
0 iconst_m1
1 invokestatic #27 <java/lang/Integer.valueOf>
4 iconst_0
5 invokestatic #27 <java/lang/Integer.valueOf>
8 iconst_1
9 invokestatic #27 <java/lang/Integer.valueOf>
12 invokestatic #33 <java/util/List.of>
15 astore_0
16 aload_0
17 invokeinterface #39 <java/util/List.iterator> count 1
22 astore_1
23 aload_1
24 invokeinterface #43 <java/util/Iterator.hasNext> count 1
29 ifeq 52 (+23)
32 aload_1
33 invokeinterface #49 <java/util/Iterator.next> count 1
38 checkcast #28 <java/lang/Integer>
41 astore_2
42 getstatic #15 <java/lang/System.out>
45 aload_2
46 invokevirtual #53 <java/io/PrintStream.println>
49 goto 23 (-26)
52 return
可以看出, for 循环主要是靠 goto
这个字节码完成的.
label
public class ForLabel {
public static void main(String[] args) {
breakLabel();
continueLabel();
}
private static void breakLabel() {
label:
// i 永远都是等于 -1
// j == 0 的时候已经 break 最外层的循环
for (var i = -1; i <= 1; i++) {
for (var j = -1; j <= 1; j++) {
for (var k = -1; k <= 1; k++) {
if (j == 0) {
// 此处相当于 return
break label;
}
}
}
}
}
private static void continueLabel() {
label:
for (var i = -1; i <= 1; i++) {
for (var j = -1; j <= 1; j++) {
// j 永远无法到达 1
// j 等于 0 的时候就跳到外层进行下一循环
for (var k = -1; k <= 1; k++) {
if (j == 0) {
continue label;
}
}
}
}
}
}