public class Test{    public static void main(String[] args){

    Integer t1 = new Integer(127);
    Integer t2 = new Integer(127);
    System.out.println("t1 == t2 ? " + (t1 == t2));
    Integer t3 = 127;
    Integer t4 = 127;
    System.out.println("t3 == t4 ? " + (t3 == t4));
    System.out.println("t1 == t4 ? " + (t1 == t4));
    Integer t5 = 128;
    Integer t6 = 128;
    System.out.println("t5 == t6 ? " + (t5 == t6));
    }
}
输出为 false,true,false,false
请问为什么,我只知道第一个false原因,其他的就不了解了谢谢

解决方案 »

  1.   

    用new的话就是不会在常量池里查找而是直接分配空间。因此第一个是false
    至于t3和t4则是用一个地址,后来定义的t4会查找127并指向t3,因此是true
    t1在堆内存,t4在栈内存,因此也是false
    最后一个不知道!!高手说说。。
      

  2.   

    Integer的值只能在-128到127之间,其他的用new创建构造一个新分配的 Integer 对象
      

  3.   

    为什么我复制这段代码运行有错误啊?
    提示构造函数Ingeger(int)未定义?
      

  4.   

    byte型在-127至128,int型在-231 ~ 231-1 (-2147483648~2147483647),怎么integer会是-127~128,怎么回事呢?请再解释下,谢谢。
      

  5.   

    楼上说的差不多,你可以调试的时候看值的id是怎么变化的,这里涉及到一个常量池的问题,拿t3,t4来说,t3放入的时候放入常量池,当t4也等于127的时候他首先回去常量池中去找,找到了就指向他不会另开辟空间。而至于t5和t6为什么不等,是因为常量池中不是存储所有的数据,在一个数据范围内可以存储,而128超出了这个范围所以就没有把他存储到常量池中,所以他们两个的id是不同的因此是false(以上仅供参考,个人理解)。
      

  6.   

    最后一个问题:
    Integer有个内部类IntegerCache,它维护了一个Integer数组cache[] ,长度为256,还有一个静态块 
    static { 
          for(int i = 0; i < cache.length; i++) 
                    cache[i] = new Integer(i - 128); 

    很明显这个静态块已经默认认创建出了-128~127 的 Integer 数据,这也是JAVA出于性能考虑。 
    至于上面的代码经过编译后就变成了  
         
      Integer t5 = Integer.valueOf(128) 
      Integer t6 = Integer.valueOf(128) 
      System.out.println("t5 == t6 ? " + (t5 == t6));
       
    看看Integer的valueOf方法,若是在-128到127之间的数,它会直接数据引用,因为它已经创建了数据对象,但若超出这个范围,它就new了一个Integer对象。所以值为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); 
     } 因此结果就是false
      

  7.   

    JVM做的改进,Integer在"-128~127"之间的不会创建(new)一个Integer出来,一当超出这范围才会创建