class BoxingTest 
{
public static void main(String[] args) 
{
Integer i1 = 100;
Integer i2 = 100;
 
if (i1 == i2) 
 System.out.println("i1 == i2");
else 
 System.out.println("i1 != i2"); Integer i3 = 200;
Integer i4 = 200;
 
if (i3 == i4) 
 System.out.println("i3 == i4");
else 
 System.out.println("i3 != i4"); }
}
输出
i1 == i2
i3 != i4
为什么?

解决方案 »

  1.   

    晕。楼主用的是JDK1.5吗?可惜没装。
      

  2.   

    你用的什么版本啊?反正我的不能通过编译.我给改成这样了:
    Integer i1 = new Integer(100);
    Integer i2 = new Integer(100);
    你如果用==来比较应该都是FALSE才对啊!
    狂晕中......
      

  3.   

    就是好!我调了一下,一样的结果,果然有点怪异...

    i3==i4换为(int)i3==i4就OK了.不知道为什么...
    i3 i4用toString() intValue()得到的值都是一样的.为什么==却是false呢?
    难道比较的是他们的地址...
    如果是地址那么为什么
    而之前的i1==i2又行呢...?
    却实是没有想通啊!
      

  4.   

    当i1,i2,i3和i4符合条件: 大于等于-128,且小于等于127  的时候,可以得到正常的结果。莫非是取值范围的问题?
      

  5.   

    按楼上的解释,,,莫非JAVA的常量缓冲池还选个头大小入住??
      

  6.   

    这是JDK1.5才有的方法。
    Integer i1 = 100 和Integer i1 = Integer.valueOf(100)是等效的。JDK1.5开始,把一些可能会频繁使用的值(-128 ~ 127)存在了cache中, 而不是新生成一个Integer对象。所以在比较时,对象指的都是同一个,因此为true.Integer i1 = 128, i2 =128 则结果为false(因为超过了值得范围)。Integer i1 = Integer.valueOf(“100”) ; Integer i2= Integer.valueOf(“100”)  时,结果也为false。 因为从String型转换到Interger时,不会使用到cache
      

  7.   

    事实是输出
    i1 == i2
    i3 != i4
    我也在纳闷哦~
      

  8.   

    GEMPMGR(GEMPMGR) 
    说的好像有道理,不知道有没有理论依据?
      

  9.   

    我怀疑,我只是怀疑阿!
    你这段代码中的“==”比较的时引用而不是具体的值。这样GEMPMGR的解释就差不多了。
      

  10.   

    lz的jdk1.5是怎么通过的呀
    我的怎么不行?!
      

  11.   

    看看JDK1.5里面, Integer.valueOf的代码就知道了。
    不知道这算不算一个bug, 因为jdk1.5以前, 对象的比较都是用equals的。
    == 比较的应该是地址
      

  12.   

    楼主在练习装箱/拆箱,应该是 良葛格 的《Java学习笔记》吧,上边介绍的挺详细的。
      

  13.   

    原因就是200超出了128,
    Integer i3 = 200;
    Integer -> int 自动拆箱就不行了,所以就新建了对象,
    Integer i4 = 200;i3,i4是两个对象,用==比较就不行了,就需要equal了ok?
      

  14.   

    GEMPMGR(GEMPMGR)强悍啊
    果然是那原因
    学习了
    佩服佩服
      

  15.   

    拆箱和装箱,Tiger的特性,呵呵,看来新特性需要学习了,呵呵
      

  16.   

    为什么我改成这样:
    class BoxingTest 
    {
    public static void main(String[] args) 
    {
    Integer i1 = new Integer(100);
    Integer i2 = new Integer(100);
     
    if (i1 == i2) 
     System.out.println("i1 == i2");
    else 
     System.out.println("i1 != i2");Integer i3 = new Integer(200);
    Integer i4 = new Integer(200);
     
    if (i3 == i4) 
     System.out.println("i3 == i4");
    else 
     System.out.println("i3 != i4");}
    }后的输出结果变成:
    i1 != i2
    i3 != i4
    了。
    真是奇怪。不解~~~