for循环------自动带StackMapTable
for (int i = 0; i < 100; i++) {
String a = "a";
}
对于字节码
// 把0放入i,再加载到栈顶. 当int取值-1~5采用iconst指令
0 iconst_0
1 istore_1
2 iload_1
// 取值-128~127采用bipush指令(b理解为byte)
3 bipush 100
// 栈2 < 100 --> 跳到17
5 if_icmpge 17 (+12)
// 从常量池种获取值
8 ldc #2 <a>
// 把'a'保存到变量2
10 astore_2
// i++
// 前一个1表示:局部变量表1位置变量(0是this,1是i变量)
// by 1递增1,即+1
11 iinc 1 by 1
// 下一个循环
14 goto 2 (-12)
17 return
while----跟上面完全一样
public void test1(){
int i = 0;
while (i < 100) {
String a = "a";
i+= 2;
}
}
0 iconst_0
1 istore_1
2 iload_1
3 bipush 100
5 if_icmpge 17 (+12)
8 ldc #2 <a>
10 astore_2
11 iinc 1 by 2
14 goto 2 (-12)
17 return
可以发现for和while的字节码都是用if_icmpXX + goto实现的