日期:2014-05-20  浏览次数:20671 次

一个Integer的问题
我在main方法中运行不同的代码段,得到的结果如下:
1
Integer x = 400;
Integer y = x;
x++;
System.out.println((x==y));
output:false
按我的理解应该是true,y和x应该指向同一个引用呀
----------
2
Integer x = 400;
Integer y = x;
System.out.println((x==y));
output:true 这个结果我能理解,x和y指向同一个引用
-----------------------------
3
Integer x = 400;
Integer y = 400;
System.out.println((x==y));
output:false 这个结果我能理解,这个是两引用不同
-----------------
4
Integer x = 400;
Integer y = x;
x++;
y++;
System.out.println((x==y));
output:false 这个结果我不能理解了,应该x和y都是指向同一个引用,只不过各自加一吧,为什么就不相同呢?


------解决方案--------------------
因为 x++ 后,x 的引用与原来的不同了引用

------解决方案--------------------
个人认为:x++相当与x=x+1与它原来的引用地址已经不同了~所以与y的引用地址不同!
------解决方案--------------------
你能理解的我就不说了。
1.
Integer x = 400;//其实是相当于 Integer x = new Integer(400);这时候在内存中有一个Integer对象,400
Integer y = x;//这个时候,Integer类型的引用y指向了上面生成的Integer对象400
x++;//这时候其实x指向了另外一个Integer对象,401。而y还是指向Integer对象400
System.out.println((x==y));//所以结果是false
output:false


4
首先要跟楼主说明白,
如果你不用400做例子,而用一些比较小的数试试,比如1,2..等等。
结果就会是true了。

还是一步一步来。
Integer x = 400;//其实是相当于 Integer x = new Integer(400);这时候在内存中有一个Integer对象,400
Integer y = x;//这个时候,Integer类型的引用y指向了上面生成的Integer对象400
x++;//x指向了新new出来的Integer对象401
y++;//y指向了新new出来的Integer对象401,虽然都是401,但对象不同了。
System.out.println((x==y)); //自然false


//题外话:
//如果不用400,而用1等比较小数,虽然执行了x++;y++;指向的对象还会是同一个Integer对象,
//因为在java对这些比较的数提供了缓存,也就是说,Integer x = 1;其实这个x指向的对象Integer对象,早已经存在(为提高效率)
//当然啦,2,等都是早就存在的,只是把引用指向了那个对象,所以x==y会得到相等的

------解决方案--------------------
Integer是引用类型,它自增还是引用类型,x++,已经不是x对象了,y++也不是原来的y对象了,所以不相等
------解决方案--------------------
显然你根本没弄清楚一个原始类型和引用类型相等如何区分,也可能是你给java的拆箱和装箱给弄糊涂了
当比较两个原始类型的时候,因为它们都是处在同一个常量池中,所以只要他们的值相同即返回true
而对于引用类型,虽然它们拆箱后也许值会相等,但是它们的引用地址不同,所以自然就返回false。
------解决方案--------------------
探讨
//题外话:……

------解决方案--------------------
。。。这不是什么缓存吧,这是Auto_Boxing_Unboxing吧。
Integer a = new Integer(1);
Integer b = new Integer(1);
System.out.println(a==b);
输出还是false.

Integer a = 1;
Integer b = 1;
System.out.println(a==b);
就是true了。