关于的Java的i++和++i的区别,初学者可能会混淆,这时候有经验的同学或同事就会告诉你,++在后,就会立马加值,

++在后则会等会儿再加,所以如果i == 0 ,那么i++ == 0,++i == 1。

  那么这个先加后加具体在字节码中是怎样一个逻辑呢?这个就需要我们去看看Java的字节码了,如何查看字节码请

参考我之前的文章IDEA设置External Tools之Javap反编译字节码

  准备两个函数

  函数test1

  

  函数test2

  

  先直接上函数的打印结果就,再来慢慢分析

  

  先看test1的字节码

  

  0~3行:一次定义了i和j两个变量,并赋值为0,存放在局部变量表。

  4~7行:开始循环的逻辑,if_icmpge是比较语句,如果j>=50则直接跳到第21行,调用打印方法。

  核心的逻辑在10~15行:

  

  现将局部变量表slot 0的变量加载到操作数栈,接着对局部变量表自增(没错,你没看错,这里是对局部

变量表自增而不是对操作数栈的变量自增)。。紧接着下一步istore_0又把栈顶的值存回局部变量表slot_0,所以,。。

最终局部变量表的值是没有改变的。

  i++分析完毕,再回看上面的字节码,其中还有值得注意的地方:

  

  21~43行:这段对应代码

1 System.out.println("i++: " + i);

  先new一个PrintStream对象,下面可以看到是new了一个StringBuilder对象。这里可能是jvm的一个优化,将字符串拼接

改成了StringBuilder来append,所以我们经常看到的有人说要把字符串拼接改成StringBuilder其实大可不必,先看下字节码

对于语句的优化是怎样的。

  接着来看test2方法的字节码:

  前面的代码和test1一样,我们直接来看不一样的地方:

  

  该段字节码对应代码:

i = ++i;

  先对局部变量表上的值自增,再加到操作数栈,最终存回到局部变量表,这样的话变量表的值就是实实在在

增加了的。

  所以,回想上面的分析,得出结论就是:i++是将变量表的值加载操作数栈后再对变量表上的值自增,而++i

则是先对变量表上的值自增后再将其加载到操作数栈。

  当然,殊途同归,最终不管是i++还是++i,都是为了自增。

  ~~本文结束,感谢各位看官。

  

最新文章

  1. Python快速建站系列-Part.Five.3-个人主页及资料页面
  2. $.ajax等相关用法
  3. IIS7.5支持解析读取.json文件数据
  4. OpenFlow Switch学习笔记(六)——Instructions和Actions
  5. [ACDream 1430]SETI 后缀数组
  6. LA 3902 Network
  7. ActiveMQ之MessageListener
  8. Guava文档翻译之ListenableFuture
  9. TCP三次握手和连接关闭过程详解
  10. Java SE基础部分——常用类库之Math和Random类(随机产生数值)
  11. Redis系列四(keepalived+lvs搭建负载均衡)
  12. 模仿Wireshark网络抓包工具实现---c++
  13. 使用ASP.NET SignalR实现一个简单的聊天室
  14. 随心测试_职场面试_001<SX的面试观点>
  15. (转)SQL SERVER 生成建表脚本
  16. [jQ/PHP]使用JS数组储值的两种情况(提交PHP处理)
  17. Unable to compile class for JSP
  18. Oracle Database(rdbms) 12.2 安装组件
  19. J2SE 8的注解
  20. 如何在网上隐藏自己的IP地址(转)

热门文章

  1. three.js尝试(二)模拟游戏开发:3D人物在地图上行走
  2. C006:多项式求值 horner法则
  3. HTML -- 表单元素1
  4. python3 if
  5. 【吴恩达课程使用】anaconda (python 3.7) win10安装 tensorflow 1.8 cpu版
  6. [LeetCode]196. 删除重复的电子邮箱(delete)
  7. [LeetCode]23. 合并K个排序链表(优先队列;分治待做)
  8. 一个提高N倍系统新能的编程点,却总是被普通开发们遗忘
  9. 能否使用GHDL+GTKWave代替Quartus ii (续——vhdl_testbench_cli)
  10. 靠这些秋招秘笈,齐姐的学妹今年已经拿到了 8 个offer!