Integer a=一个数(比如说50)
Integer b=一个数(比如说50)
System.out.println(a==b);
打印结果会是什么呢?我测试了有true false2种答案,实在是搞不明白,请教下

解决方案 »

  1.   

    你试试a=128,b=128;和a=127,b=127;为什么我不高数你~~~~
      

  2.   

    理论上应该是false啊,我试试啊
      

  3.   

    Integer a=new Integer(比如说50);
    Integer b=new Integer(比如说50);
      

  4.   

    恩,建议楼主使用2楼的建议测试一下。。
    --
    提示一下。可以参考String中,为什么 String s = "a"+"b";只创建了一个对象。
      

  5.   


    不new的话,超过127就是都是false了,
    负数可到-128这是8位下的,补码有符号整数范围也许自动装箱 也有一个 和 字符串池类似的东西,大小就是之上的范围。
      

  6.   

    去看看Integer.valueOf的源码,一目了然
      

  7.   

    0-127 时,如果定义两个Integer 变量是,则指向同一地方,而大于127时则指向不同的地方了,我是这样理解的,不知对你有没有用
      

  8.   

    转一下:
    那我们晕了就相差1的两个数为啥走向了“反目成仇”的地步呢?凭啥127等于127,我128就不等于128呢?且听我慢慢道来,Integer a =127,Integer a=128。127,128应该不会造成什么差异吧,难道是自动装箱的过程有猫腻?找下源码看看:private static class IntegerCache {
        private IntegerCache(){}    static final Integer cache[] = new Integer[-(-128) + 127 + 1];    static {
            for(int i = 0; i < cache.length; i++)
            cache[i] = new Integer(i - 128);
        }
        }public static Integer valueOf(int i) {
        final int offset = 128;
        if (i >= -128 && i <= 127) { // must cache 
            return IntegerCache.cache[i + offset];
        }
            return new Integer(i);
        }源码解释:当我们装箱是,jvm实际上是自动调用的valueOf()这个方法,也就是Integer a= 10相当于Integer.valueOf(10)//Integer是静态类.好,我们看下Integer a = 127 的执行过程,首先调用Integer.valueOf(127) ,由于127在-128到127之间(看上面的源码),所以返回一个缓存值 return IntegerCache.cache[127+128];也就是数组中下标是255的值,那这个到底是什么值呢? 我们继续看:static {
            for(int i = 0; i < cache.length; i++)
            cache[i] = new Integer(i - 128);
        }这是用一个for循环对数组cache赋值,cache[255] = new Integer(255-128),也就是newl一个Integer(127) ,并把引用赋值给cache[255],好了,然后是Integer b= 127,流程基本一样,最后又到了cache[255] = new Integer(255-128),这一句,那我们迷糊了,这不是又new了一个对象127吗,然后把引用赋值给cache[255],我们比较这两个引用(前面声明a的时候也有一个),由于是不同的地址,所以肯定不会相等,应该返回false啊!呵呵,这么想你就错了,请注意看for语句给cache[i]初始化的时候外面还一个{}呢,{}前面一个大大的static关键字大咧咧的杵在哪呢,对静态的,那么我们就可以回想下static有什么特性了,只能初始化一次,在对象间共享,也就是不同的对象共享同一个static数据,那么当我们Integer b = 127的时候,并没有new出一个新对象来,而是共享了a这个对象的引用,记住,他们共享了同一个引用!!!,那么我们进行比较a==b时,由于是同一个对象的引用(她们在堆中的地址相同),那当然返回true了!!!然后我们在看Integer c = 128;Integer d = 128;这两句。现在不用我说就应该能明白了吧,当数据不再-128到127之间时,是不执行return IntegerCache.cache[i + offset];这句的,也就是不会返回一个static的引用,而是执行了return new Integer(i); 于是当 Integer d = 128 时,又会重新返回一个引用,两个不同的引用
    在做c==d 的比较时当然返回false了!!
      

  9.   

    呵呵,2 楼不告诉你,我告诉你吧,参考下面这个帖子的第二题:http://topic.csdn.net/u/20080130/17/7fdd8b93-bdd6-467a-863e-fc3c9731bc52.html解释在 68 楼
      

  10.   

    二话不说。fals,可以告诉你的是,看到equals就是fals
      

  11.   

    (a==b)的结果其实就是布尔值,就和if(a==b)里的一样
      

  12.   

    -128 ~ 127 true,
    其他 false
    看看API
      

  13.   

    看了14楼,我只能说我还有很多东西要学Mark+Favorites