Java中i++,++i都表示 i = i+1

i++是先是使用 i的原值,然后再原值的基础上加1.

++i是先在原值的基础上加1,然后在使用i的值。

直接看一个示例:

public class Test1 {public static void main(String [] args){int i = 0,j;j = i++;      //i++ 先使用i的值,所以j = 0,然后执行i自增1,此时i等于1System.out.println("j = " + j+",i = "+i);}
}
Output:
j = 0 , i = 1
public class Test2 {public static void main(String [] args){int i = 0,j;j = ++i;  //++i 先执行i加1,此时i等于1,然后把i的值赋给j,j等于1System.out.println("j = " + j+",i = "+i);}
}
Output:
j = 1 , i = 1

上面两个例子都很好理解。

再看下面这两段代码:
public class Test3{public static void main(String[] args){int i = 0;for(int j = 0;j < 5; j++){i = i++;System.out.println("i =" + i);}}
}
本以为会输出:i = 0i = 1i = 2i = 3i = 4

可是实际上输出的是:

Output:
i = 0
i = 0
i = 0
i = 0
i = 0

可是为什么输出都是0呢????

再看 i = ++i 的情况:
public class Test {public static void main(String[] args){int i = 0;for(int j = 0;j < 5; j++){i = ++i;System.out.println("i =" + i);}}
}
Output:
i =1
i =2
i =3
i =4
i =5

因为Java采取了中间变量缓存机制!

在java中, 执行自增运算时,会为每一个自增操作分配一个临时变量 ,如果是前缀加(++i),就会“先自加1后赋值(给临时变量)”;如果是后缀加(i++),就会“先赋值(给临时变量)后自加1”。 运算最终使用的,并不是变量本身,而是被赋了值的临时变量 。
如在Test3中:
 i = i + 1;
在内存中开辟空间,记录i的初始值0,同时开辟另一个临时变量的缓存空间,将i变量的临时值记录下来,随后i进行自增运算i = i+1,此时i = 1,覆盖原空间中的0,此时右边的运算才算完成, 随后进行赋值运算,即将temp的值赋给i,i又边长了0.
相当于:
int temp = i;  //先使用i的值
i  = i + 1;
i = temp;

在Test4中 i = ++ i 相当于:

i = i + 1;  //先自增1,再使用i的值
int temp = i;
i = temp; 

Java中i++,++i 和i= i+ 1的区别相关推荐

  1. Java中,一切皆是对象——java中的对象类型与基本数据类型的区别

    起因:取一个list给另一个list赋值,然后在另一个list中取出进行修改.list其中类型为对象时,String时,基本数据类型时. [java中的对象类型与基本数据类型的区别] #声明和实例化 ...

  2. java堆和栈 常量池_GitHub - han-guang-xue/difference-of-stack-heap-pool: Java中堆、栈和常量池的区别...

    Java中堆.栈和常量池的区别 栈 堆 常量池的概念 首先我们先了解一下概念,Java把内存分成两种,一种叫做栈内存,一种叫做堆内存. 栈内存 存放基本类型的变量数据和对象类型的引用(请注意存放的是引 ...

  3. Java中Array和ArrayList之间的9个区别

    array和ArrayList都是Java中两个重要的数据结构,在Java程序中经常使用. 即使ArrayList在内部由数组支持,了解Java中的数组和ArrayList之间的差异对于成为一名优秀的 ...

  4. java中的NIO和IO到底是什么区别?20个问题告诉你答案

    摘要:NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多. 本文分享自华为云社区<jav ...

  5. java中list,set,map集合的区别,及面试要点

    Map集合:链接: Map集合的五种遍历方式及Treemap方法 Set集合:链接: Java中遍历Set集合的三种方法 TreeSet集合:链接: Java深入了解TreeSet,和迭代器遍历方法 ...

  6. java中*和**的作用 以及 /和/*和/**的区别

    一.java中*和**的作用 "*"就表示了所有的文件,但是"*"并不包括子目录下的文件: "**"匹配包含任意级子目录中所有的文件: 二. ...

  7. 解析java中方法的重载和重写之间的区别与联系

    解析java中方法的重载和重写之间的区别与联系 1 不同点 1.1 方法重写是在不同的类中(父子类),方法重载是在同一类中 1.2 方法重载最初的目的是构造方法的多样化,方法重写的目的是让重写的方法满 ...

  8. java final 变量 回收_java入门教程-Java中final,finally,finalize三个关键字的区别

    final 当这个关键字修饰一个类时,意味着他不能派生出新的子类,也就是说不能被继承,因此一个类不能被同时声明为abstract和final.当final修饰变量或者方法时,可以保证他们在使用中不会被 ...

  9. 浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  10. Java中抽象类、接口、父类直接的区别与联系

    抽象类与接口的区别: 1)抽象类是一个只有变量或方法申明的类,这些变量(属性)和方法都是抽象类型的.抽象类没有对方法的实现. 2)接口则是一个只有方法申明.没有方法的实现,接口的方法也同样是抽象方法, ...

最新文章

  1. ArcGIS对AutoCAD操作的图文教程
  2. web API简介(二):客户端储存之document.cookie API
  3. python web自动化_Selenium+Python Web自动化
  4. vscode请更新includepath_VS Code Java 九月更新!Coding Pack for Java 带来一键安装新体验!...
  5. javascript学习系列(9):原数组发生变化的情况
  6. python判断正负的函数_Python |在计算操作的函数内将负数转换为正数?
  7. 微软面试题1、把二元查找树转变成排序的双向链表
  8. W3C 宣布:WebAuthn 成为正式 Web 标准
  9. cad上样条曲线上的点太多了_学习CAD,我总结了五个阶段,你是那个段位?
  10. 老顽童java模拟器_在这款神还原的小霸王模拟器上,我终于玩到了20年前的老游戏,真香...
  11. 基于深度学习的实时噪声抑制——深度学习落地移动端的范例
  12. html 公式编辑器,基于web的在线复杂公式编辑器的实现
  13. 零基础转行到IT,怎么选择适合的职业?
  14. JAVA学习笔记——BLOB类型和数据批量操作
  15. 华为云——开发者技能测评
  16. 我爱Flask之url_for()方法和HTTP请求
  17. 报告出炉:清北毕业生都去哪了?
  18. 怎么把php字幕导入视频,怎么往视频加广告还有字幕 字幕怎么导入视频里|视频字幕制作软件怎么把字幕嵌入视频...
  19. python爬pdf的曲线_Python爬取读者并制作成PDF
  20. linux命令ps -ef输出结果,Linux ps 命令

热门文章

  1. 文件操作——修改文件名
  2. Linux Kernel 2.6.9源码分析 -- send/recieve 报文
  3. 数字经济时代的网络安全发展形势分析与趋势展望
  4. 从不温不火到炙手可热:语音识别技术简史
  5. Web应用技术(第十周和第十一周/3h)
  6. UE风格化Day5-Rizom展UV的一些问题
  7. python电商项目介绍_电商大数据项目-推荐系统实战(一)
  8. 5位数的数字黑洞是多少_目前对于6174数字黑洞现象是否有合理的解释或证明?...
  9. oracle 19c RAC 19.0升级到19.16
  10. ASTM F2613-19儿童折叠椅和凳子强制性安全标准