上面两条操作数栈和局部变量表相关的字节码指令还是比较容易理解的,下面再看一下第二步int j=i++的执行过程:
在上图中需要注意的是,iinc能够直接更新局部变量表中的变量值,它不需要把数值压到操作数栈中就能够直接进行操作。在上面的过程中,抛去赋值等其他操作,i++实际执行的字节码指令是:
2: iload_1
3: iinc 1, 1
如果把它翻译成我们能看懂的java代码,可以理解为:
int temp=i;
i=i+1;
也就是说在这个过程中,除了必须的自增操作以外,又引入了一个新的局部变量,接下来我们再看看++i的执行过程。
++i 执行过程
我们对上面的代码做一点小小的改动,仅把i++换成++i,再来分析一下++i的执行过程是怎样的。
public static void main(String[] args) {
int i=3;
int j=++i;
System.out.println(j);
}
同样,用javap反编译字节码文件:
int i=3对应前两行字节码指令,执行过程和前面i++例子中完全相同,可以忽略不计,重点还是通过图解的方式看一下int j=++i对应的字节码指令的执行过程:
抛去赋值操作,++i实际执行过程只有一行字节码指令:
2: iinc 1, 1
转换成能理解的java代码的话,++i实际执行的就在局部变量中执行的:
i=i+1;
这么看来,在使用++i时确实比i++少了一步操作,少引入了一个局部变量,如果在运算结果相同的场景下,使用++i的话的确效率会比i++高那么一点点。
那么回到开头的问题,两种自增方式应用在for循环中执行的时候,那种效率更高呢?刚才得出的结论仍然适用于for循环中吗,别急,让我们接着往下看。
for循环中的自增
下面准备两段包含了for循环的代码,分别使用i++后置自增和++i前置自增:
//i++ 后置自增
public class ForIpp {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
System.out.println(i);
}
}
}
//++i 前置自增
public class ForPpi {
public static void main(String[] args) {
for (int i = 0; i < 5; ++i) {
System.out.println(i);
}
}
}
老规矩,还是直接反编译后的字节码文件,然后对比一下指令的执行过程:
到这里,有趣的现象出现了,两段程序执行的字节码指令部分居然一模一样。先不考虑为什么会有这种现象,我们还是通过图解来看一下字节码指令的执行过程:
可以清晰的看到,在进行自增时,都是直接执行的iinc,在之前并没有执行iload的过程,也就是说,两段代码执行的都是++i。这一过程的验证其实还有更简单的方法,直接使用idea打开字节码文件,就可以看到最终for循环中使用的相同的前置自增方式。
那么,为什么会出现这种现象呢?归根结底,还是java编译器对于代码的优化,在两种自增方式中,如果没有赋值操作,那么都会被优化成一种方式,就像下面的两个方法的代码:
void ipp(){
int i=3;
i++;
}
void ppi(){
int i=3;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Java)
最后
由于细节内容实在太多了,为了不影响文章的观赏性,只截出了一部分知识点大致的介绍一下,每个小节点里面都有更细化的内容!
小编准备了一份Java进阶学习路线图(Xmind)以及来年金三银四必备的一份《Java面试必备指南》
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
46830437)]
小编准备了一份Java进阶学习路线图(Xmind)以及来年金三银四必备的一份《Java面试必备指南》
[外链图片转存中…(img-vay060K8-1713846830437)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!