public class StringAB {
   public static void main(String[] args) {
      Integer a = 100; 
      Integer b = 100; 
      System.out.println(a==b);    //返回值为true
      
      Integer i = 1000; 
      Integer j = 1000; 
      System.out.println(i==j);     //返回值为false
   }
}      这是一个相当奇怪的现象。我非常不理解,100和1000不都是int的表示范围吗?
 

解决方案 »

  1.   

    去看看Integer源代码或者java语言规范就知道了你不new Integer的时候,从1到一百二十几(具体数值忘记了)都是同一个对象,单例的,超过了这个范围就每次new一个对象给你
      

  2.   

    就是下面这个方法,源代码我都给你贴上来了 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);
        }
      

  3.   

    是从-128到127,他们的对象被缓存了,当年sun认为这样可以提高效率
      

  4.   

    这不是自动装箱问题,这是java对Integer的实现问题。你可以看看java的源代码,java对部分数字做了优化。
      

  5.   

    "=="是判断两个对象所指的内存地址是否相等。对于如下范围的简单数据类型: 
    boolean类型的值 
    所有byte类型的值 
    在-128~127之间的short类型的值 
    在-128~127之间的int类型的值 
    在\u0000~\u007F之间的char类型的值 在进行自动装箱的时候,将会首先检查内存中是否已经有使用自动装箱产生的具有相同值的对象,如果已经有一个“值”相同的对象产生,那么并不会产生新的对象。 
      

  6.   

    察看下Integer的源码,你就明白了,是缓存了。2楼贴出来了。
    java大有前途,看看我们做的界面跟flash一样,但功能强大的 照片上传和 礼品定制applet。
    亮酷网 (长虹官方网上数码冲印 ) <a href="http://www.liangkoo.com"/> 精彩Applet</a>
      

  7.   

    在自动装箱时对于值从-128--127之间的值,它们被装箱为Integer对象后,会在内存中被重用,所以代码1中的i1与i2实际上是参考至同一个对象(即i1与i2指向同一个对象)。如果超过了-128--127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建了一个Integer对象,所以,代码2使用==进行比较时,i1和i2参考的是不同的对象。参考,有详细说明
    http://www.java1995.cn/article/709.htmlhttp://www.java1995.cn/article/848.html
      

  8.   


    我设计了如下的程序:public class StringAB {
       public static void main(String[] args) {
    //      Integer a = 100; 
    //      Integer b = 100; 
    //      System.out.println(a==b);    //返回值为true
    //      
          
       for(int i = 120 ; i < 200; i ++)
       {
       Integer a = i ;
       Integer b = i;
       
       System.out.println("第" + i  + " :" +(a  == b));
       }
       }
    }运行的结果是:
    第120 :true
    第121 :true
    第122 :true
    第123 :true
    第124 :true
    第125 :true
    第126 :true
    第127 :true
    第128 :false
    第129 :false
    第130 :false
    第131 :false
    第132 :false
    第133 :false
    第134 :false
    第135 :false
    第136 :false
    第137 :false
    第138 :false
    第139 :false
    第140 :false
    第141 :false
    第142 :false
    第143 :false
    第144 :false
    第145 :false
    第146 :false
    第147 :false
    第148 :false
    第149 :false
    第150 :false
    第151 :false
    第152 :false
    第153 :false
    第154 :false
    第155 :false
    第156 :false
    第157 :false
    第158 :false
    第159 :false
    第160 :false
    第161 :false
    第162 :false
    第163 :false
    第164 :false
    第165 :false
    第166 :false
    第167 :false
    第168 :false
    第169 :false
    第170 :false
    第171 :false
    第172 :false
    第173 :false
    第174 :false
    第175 :false
    第176 :false
    第177 :false
    第178 :false
    第179 :false
    第180 :false
    第181 :false
    第182 :false
    第183 :false
    第184 :false
    第185 :false
    第186 :false
    第187 :false
    第188 :false
    第189 :false
    第190 :false
    第191 :false
    第192 :false
    第193 :false
    第194 :false
    第195 :false
    第196 :false
    第197 :false
    第198 :false
    第199 :false
    可见127是正数的一个分隔点;正数小于等于127的是同一个,大于的是两个不同的对象!
      

  9.   

    上面有一楼说的很对,==是不能比较内存地址,equals可以比较内存地址,而==可以比较俩个数的大小