/*
2008年11月15日17:33:06
有关自动装箱的问题:Integer i1 = 100; 会自动转化成 Integer i1 = new Integer(100); 么
*/public class TestAutoboxing3
{
public static void main(String[] args)
{
Integer i1 = 100;  //
Integer i2 = 100;
boolean b1 = (i1==i2);
System.out.println(b1); Integer i3 = new Integer(100);
Integer i4 = new Integer(100);
boolean b2 = (i3==i4);
System.out.println(b2);
}
}
/*
在JDK 1.6中的运行结果是:
-----------------------
true
false
-----------------------
我看课本上说:
在JDK1.6中
Integer i1 = 100; 会自动转化成 Integer i1 = new Integer(100);
如果真是这样的话,那为什么 i1==i2 返回true,i3==i4返回false呢????
*/

解决方案 »

  1.   

    1. Integer=100; 实际上调用的是Integer.valueOf(int i);
    因为从-127到128之间的Integer数,Java在Integer中有事先缓存好的原型对象,每次返回的都是同一个Integer对象,只有不在这个范围的数才会new出一个Integer,你可以试试300时,b1就是false了,而i3和i4则确实是两个Integer对象.
    2. 对象间用==比校的是两个对象的引用地址是否一致,即比校是不是一个对象.而不是比内容是否一致
    3. Integer应该用equal来比校是否相等.
      

  2.   

    谢谢Iangao ,小弟也贴出自己的一点心得/*
        2008年11月15日17:33:06
        有关自动装箱的问题:Integer i1 = 100; 会自动转化成 Integer i1 = new Integer(100); 么 答案:
    Integer i1 = 100; 
    100不是自动转化成 new Integer(100); 而是自动转化成Integer.valueOf(100)
    */public class TestAutoboxing5
    {
        public static void main(String[] args)
        {
            Integer i1 = 100;  
            Integer i2 = 100;
            boolean b1 = (i1==i2);
            System.out.println(b1);        Integer i3 = Integer.valueOf(100);
            Integer i4 = Integer.valueOf(100);
            boolean b2 = (i3==i4);
            System.out.println(b2); Integer i5 = new Integer(100);
    Integer i6 = new Integer(100);
    boolean b3 = (i5==i6);
    System.out.println(b3);
        }
    }
    /*
        在JDK 1.6中的运行结果是:
    -----------------------
    true
    true
    false
    -----------------------
    总结:
    本程序说明了:
    Integer i1 = 100; //100不是自动转化成 new Integer(100); 而是自动转化成Integer.valueOf(100) 下面是摘自某网友的话:
    --------------------------------
    1. Integer=100; 实际上调用的是Integer.valueOf(int i); 
    因为从-127到128之间的Integer数,Java在Integer中有事先缓存好的原型对象,
    每次返回的都是同一个Integer对象,只有不在这个范围的数才会new出一个Integer,
    你可以试试300时,b1就是false了,而i3和i4则确实是两个Integer对象. 
    2. 对象间用==比校的是两个对象的引用地址是否一致,即比校是不是一个对象.而不是
    比内容是否一致 
    3. Integer应该用equal来比校是否相等. --------------------------------
    */
    再贴一个程序
    /*
    2008年11月15日17:33:06
    自动装箱所产生的范围问题
    */public class TestAutoboxing3
    {
    public static void main(String[] args)
    {
    Integer i1 = 100;  
    Integer i2 = 100;
    boolean b1 = (i1==i2);
    System.out.println(b1); Integer i3 = 200;
    Integer i4 = 200;
    boolean b2 = (i3==i4);
    System.out.println(b2);
    }
    }
    /*
    在JDK 1.6中的运行结果是:
    -----------------------
    true
    false
    -----------------------
    -128到127的任何一个值,无论自动装箱多少次,在内存中都是只有一份拷贝
    超过了-128到127的任何一个值,每次自动装箱时,都会在内存中产生一分不同的拷贝
    */