我在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.   

    个人认为:x++相当与x=x+1与它原来的引用地址已经不同了~所以与y的引用地址不同!
      

  2.   

    你能理解的我就不说了。
    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会得到相等的
      

  3.   

    顶3楼!学习了!以下只是我的一个猜测(只是个人的一个“猜测”)希望指点:
    ++或者--这个操作符操作基本数据类型时候就不用说了,自身操作,大家都明白。++或--这个操作符在操作对象的时候,或者说操作对象的引用时候,Java是不是给提供了一个接口,来实现对引用的这种操作?
    就好比Comparable这个接口似的。
      

  4.   

    Integer是引用类型,它自增还是引用类型,x++,已经不是x对象了,y++也不是原来的y对象了,所以不相等
      

  5.   

    显然你根本没弄清楚一个原始类型和引用类型相等如何区分,也可能是你给java的拆箱和装箱给弄糊涂了
    当比较两个原始类型的时候,因为它们都是处在同一个常量池中,所以只要他们的值相同即返回true
    而对于引用类型,虽然它们拆箱后也许值会相等,但是它们的引用地址不同,所以自然就返回false。
      

  6.   

    以前还真不知道java给这些比较小的数提供了缓存。实验了下,觉得3楼说的还不够精确。
    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);
      

  7.   

    自动装箱拆箱,Integer的范围只有 -128~127
    超出范围,是不同的地址
      

  8.   

    这不是什么缓存吧,这是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了。
      

  9.   

    自动装箱拆箱,Integer的范围只有 -128~127 
    超出范围,是不同的地址
    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
      

  10.   

    Integer a = new Integer(1); 
    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 
    这个又是什么原因呢?
      

  11.   


    //只要是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
      

  12.   

    我是这样理解的,
    a++;是a = a+1的意思,并不是new出来的啊.a的值是1,表达式右边是2
    相当于a = 2,而a是Integer的,所以相当于Integer a = 2这种形式。
    又回到Auto_Boxing_Unboxing了
      

  13.   

    Integer a = 128;
    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