我在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都是指向同一个引用,只不过各自加一吧,为什么就不相同呢?
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都是指向同一个引用,只不过各自加一吧,为什么就不相同呢?
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会得到相等的
++或者--这个操作符操作基本数据类型时候就不用说了,自身操作,大家都明白。++或--这个操作符在操作对象的时候,或者说操作对象的引用时候,Java是不是给提供了一个接口,来实现对引用的这种操作?
就好比Comparable这个接口似的。
当比较两个原始类型的时候,因为它们都是处在同一个常量池中,所以只要他们的值相同即返回true
而对于引用类型,虽然它们拆箱后也许值会相等,但是它们的引用地址不同,所以自然就返回false。
java应该给提供8位Integer缓存,从-128到127,跟byte的取值范围相同,也就是说如果超过这个范围,new出来的是不同的地址。Integer a = 128;
Integer b = 128;
System.out.println(a==b);//结果为false,指向不同对象;如果换成在-128到127的结果为true
//也就是说即使如下这样,还是flase
Integer a = 1;
Integer b =a;
a =a+127;
b =b+127;
System.out.println(a==b);
超出范围,是不同的地址
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了。
超出范围,是不同的地址
package com.lihan;
public class Test {
public static void main(String args[]){
Integer a=400;
Integer b=400;
System.out.println(a==b);
Integer c=13;
Integer d=13;
System.out.println(c==d);
}
}
false
true
Integer b = new Integer(1);
System.out.println(a==b);
输出还是false. 然后
Integer a = new Integer(1);
Integer b = new Integer(1);
a++;
b++;
System.out.println(a==b);
output:true
这个又是什么原因呢?
//只要是new Integer,不管数据是多少,a==b都是false
Integer a = new Integer(40);
Integer b = new Integer(40);
System.out.println(a==b); // false//如果不是new Integer,数据在-128~127之间时,a==b是true,否则为false
Integer a = 127;
Integer b = 127;
System.out.println(a==b); // trueInteger a = 128;
Integer b = 128;
System.out.println(a==b); // false
a++;是a = a+1的意思,并不是new出来的啊.a的值是1,表达式右边是2
相当于a = 2,而a是Integer的,所以相当于Integer a = 2这种形式。
又回到Auto_Boxing_Unboxing了
Integer b = 128;
System.out.println(a==b);falseInteger a = 128;
Integer b = 128;
a--;
b--;
System.out.println(a==b);trueInteger a = 127;
Integer b = 127;
System.out.println(a==b);trueInteger a = 127;
Integer b = 127;
a++;
b++;
System.out.println(a==b);false