今天偶然发现了一个有趣小问题
Integer   a=new Integer(3);
int b=a;
System.out.println(a==b);//true
//==============================
Integer   a=new Integer(3);
int b=3;
System.out.println(a==b);//也是true
a是引用 b是变量  但是结果却是true,我就像是不是引用a里直接存的是3而不Integer对象的地址呢?
然后我就又做了一个测试验证我的想法:
Integer   a=new Integer(3);
Integer   b=new Integer(3);
int c=3;
如果我的想法成立的话那么,下面的结果都应该是true才对,但是呢结果却出乎我的意料
System.out.println(a==c);//true
System.out.println(a==c);//true
System.out.println(a==b);//false
a==c; b==c  而a!=b很诡异啊
后来我又想如果我开始的想法是错误的,a,b还是分别都指向了一个不同的对象,但是a==c;和b==c结果却是true
那么是什么原因导致的呢?
我想来想去只有一种可能才会产生这种结果,
就是在用==比较基本类型和其包装类的时候==运算符被重载了 它比较的是基本类型变量的值和包装类对象的值 而不是基本类型变量和包装类引用的值
这就是我的发现和一些想法 ,,希望大家也都说出自己的想法,一起学习!!!

解决方案 »

  1.   

    基本类型变量和它对应的包装器类型比较的时候会进行自动拆箱。
    http://blog.csdn.net/ZangXT/archive/2008/11/19/3334030.aspx
    可以看看。
      

  2.   

    这是自动拆箱和装箱,没什么稀奇的。如果记忆没错的话应该是JDK1.5后才有的功能.
      

  3.   

    自动装箱与拆箱。int型数据在小于128时如果new一个对象,就直接去常量池里取出数据,与int直接定义一个整型数据效果是一样的,大于128就不等了,楼主可以做一下测试。
      

  4.   


    我测试了一下 用的333但是还是会相等
    Integer   a=new Integer(333);
    Integer   b=new Integer(333);
    int c=333;
    System.out.println(a==c);//true
    System.out.println(b==c);//true
    System.out.println(a==b);//false
      

  5.   

    Integer  a=new Integer(3); 
    你换成1000在看看// Integer a = 100;
    // Integer b = 100;
    //
    // Integer c = 1000;
    // Integer d =1000;
    // if(a==b)
    // System.out.println("oh yes");
    // else
    // System.out.println("oh no");
    //
    // if(c==d)
    // System.out.println("oh yes");
    // else
    // System.out.println("oh no");
    运行下 你就知道了
      

  6.   

    如果你用的是JDK1.5的话这个没什么奇怪的int 会被自动的包装成Integer,但是有一点你一定要记住new关键字出现的话一点会分配空间的也就可以解释:
    Integer  a=new Integer(3); 
    Integer  b=new Integer(3); 
    int c=3; int是一个基本数据类型是放在栈里边的,对象只会新建一个引用指向这个基本数据类型的地址,而不会分配内存来存储地址
    System.out.println(a==c);//true 直接在栈中找3这个基本数据类型不会再分配内存地址,找到了后直接包装成Integer对象,也就是新建了一个引用指向这个3,a是new出来的堆中已经有一个3的引用了当然地址与int c=3所包装出来的Integer的地址相同,当然比较的结果为true。提示一句==比较对于基本数据类型来说比较的是值,而引用数据类型(对象类型、复杂数据类型)比较的是地址,因为这些类型由JVM分配的空间里面实际上保存的是地址。
    System.out.println(a==c);//true 同上
    System.out.println(a==b);//false 然而b是new出来的所以这个为什么等于false了该明白了吧!
      

  7.   


     Integer a = new Integer(10000);
     Integer b = new Integer(10000);
     int c = 10000;//只要是int都会去常量池里面找的。
     System.out.println(a == c);// true
     System.out.println(b == c);// true
     System.out.println(a == b);// false楼主肯定没明白的地方是只有Integer(-128~~127)才缓存,而且只要是int不管多大都会缓存的。
      

  8.   

    楼主肯定没明白的地方是只有Integer(-128~~127)才缓存,但是只要是int不管多大都会缓存的。
      

  9.   

      public static void test1() {
        Integer a = 3;
        Integer b = 3;
        int c = 3;    System.out.println(a == c);// true
        System.out.println(a == c);// true
        System.out.println(a == b);// true
      }  public static void test2() {
        Integer a = 3333;
        Integer b = 3333;
        int c = 3333;    System.out.println(a == c);// true
        System.out.println(a == c);// true
        System.out.println(a == b);// false
      }这个才是你测试的例子。 你的那个 a和 c比较,其实是int的比较,不是Integer的比较
      

  10.   


    明白了,原来我一直都没弄明白4楼和其他人的意思,,一直用new Integer()试验。自己把自己绕进去了,哈哈。谢谢25楼 ,我像这次应该不会理解错了,稍后我再发个帖子写一下,我理解的自动装箱与拆箱。希望大家取看一下,给点建议。