引言
这两天忙得要命,天天擦屁股,没有时间来写博客。这篇博客酝酿了三四天了,今天刚好抽出一点时间来写(晚上学校缴费平台系统还要上线,扎心啊)。
前两天在**“java小葵花妈妈课堂**”中,曹贱贱提了一个很基本很基本的灵魂一问,让我们仿佛置身于2016年刚出来找工作的时候。当年只知道两者好像有区别,但是找工作的时候不会在意这些细节,因为没有做过项目,也意识不到这个问题的重要性,现在刚好跟大家一起学习下。
问题是这样的,问i++ 和++i的区别? 废话不多说,我们来通过例子分析下。
代码分析
public static void test1(){
int i=0;
i = (i++);
System.out.println("i的值是:"+i);
int j=0;
j = ++j;
System.out.println("j的值是:"+j);
}
运行结果
i的值是:0
j的值是:1
纳尼??? 特么是不是很惊讶?这种细节你关心过没?反正我是有点预料之外的。
那么我们来分析下,到底怎么回事。
首先确认两点:
不管是对象还是常量还是方法,都是通过指向他的引用使用它的值。
不管是i++还是++i,他们和运算符优先级没有关系。
那么我们来分析i++:
- 在i指向的引用中,直接将常量i加1,引用是没有改变的;
我们再来分析 i=i++:
- 这个方法首先把i的引用指向了i;
- 在从堆中开辟一块内存,用来存储i+1的值;
- 此时i依然指向之前的值。
总结:单独使用i++;i的值会改变,但是当通过引用使用此常量的时候,会指向以前的旧值。
我们再来分析++i:
- 首先开辟一块内存,将常量i+1保存,引用是没有改变的;
那么i=++i呢?
- 首先开辟一块内存,将常量i+1保存;
- 然后将新值的引用指向i;
总结:单独使用++i;i的值会改变,当通过引用使用此常量的时候,会指向新值。
再列举几个经典的小李子:
- 例子1:
public static void test2(){
int i=0;
i++;
System.out.println("i的值是:"+i++);
System.out.println("i的值是:"+i);
}
运行结果:
i的值是:1
i的值是:2
解读:
public static void test2(){
int i=0;
i++;//
System.out.println("i的值是:"+i++);//此时输出的是i的引用,即旧值,但是实际上,内存中已经发生了常量的改变
System.out.println("i的值是:"+i);//此时i+1的引用已经重新指向了i
}
- 例子2
public static void test3(){
int i = 0;
i = i++ + ++i;
System.out.println("i的值是:"+i);
}
运行结果:
i的值是:2
总结
(1)单独使用i++;i的值会改变,但是当通过引用使用此常量的时候,会指向以前的旧值。
(2)单独使用++i;i的值会改变,当通过引用使用此常量的时候,会指向新值。
大家如果有什么疑问或者其他好玩的小程序欢迎给我留言!!!
作者:select you from me
来源:CSDN
转载请联系作者获得授权并注明出处。