Java - 循环语句 for

本文探讨了Java中的for循环与while循环,并通过字节码展示了它们的执行过程。在`common()`方法中,for循环依赖于`goto`指令实现循环。而在`iter()`方法中,遍历列表的for-each循环同样使用了字节码进行迭代。此外,文章还介绍了带标签的break和continue语句在多层循环中的应用。
摘要由CSDN通过智能技术生成

Java - 循环语句 for


前言

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;
                    }
                }
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值