【求助】有关自动装箱的问题: Integer i1 = 100; 会自动转化成 Integer i1 = new Integer(100); 么

时间:2022-10-10 20:40:11

/*
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呢????
*/

4 个解决方案

#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


帮顶了~~~~~~~~~~~~

#3


谢谢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的任何一个值,每次自动装箱时,都会在内存中产生一分不同的拷贝
*/

#4


原来还有些模糊,现在清晰了。

#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


帮顶了~~~~~~~~~~~~

#3


谢谢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的任何一个值,每次自动装箱时,都会在内存中产生一分不同的拷贝
*/

#4


原来还有些模糊,现在清晰了。