代码如下:
public class TestValue {
public static void main(String[] args) {
Integer a = 333;
Integer b = 444;
Long c = 777L;
System.out.println(c==(a+b));
}
}
输出为true。调用javap查看字节码文件(部分):   24: aload_3
   25: invokevirtual #35; //Method java/lang/Long.longValue:()J
   28: aload_1
   29: invokevirtual #39; //Method java/lang/Integer.intValue:()I
   32: aload_2
   33: invokevirtual #39; //Method java/lang/Integer.intValue:()I
   36: iadd
可以看出 c==(a+b)其实变成了c.longValue()==(a.intValue+b.intValue)但是前者依然是long,后者依然是int,二者占用的slot应该是不一样的,如果==比较的是对象的内存地址,应该输出false才对,为什么输出的是true呢?

解决方案 »

  1.   

    确实挺奇怪的
    我下面的代码也是
    Integer i1 = new Integer(5);
    Integer i2 = new Integer(5);
    Integer i3 = new Integer(10);
    System.out.println(i3 == 2*i2);
    输出也是true
      

  2.   

    我知道做了自动拆箱,问题是存long需要用64byte,存int只需32byte,它们的在常量池的地址怎么会一样?
      

  3.   

    java中的数据类型,可分为两类: 
    1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean 
      他们之间的比较,应用双等号(==),比较的是他们的值。 
    2.复合数据类型(类) 
      当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。-----------------------------------------------------
    Integer自动拆箱之后其实用的就是基本类型int  这个时候其实比的就是值了
      

  4.   

    都得出 c==(a+b)其实变成了c.longValue()==(a.intValue+b.intValue)的结论了比较的根本就不是对象类型
      

  5.   

    java虚拟机会对基本类型和包装类之间进行自动拆包和封装包,最终做比较时依然比较值
      

  6.   

    c.longValue()==(a.intValue+b.intValue);c.longValue()=========================>>> long 并不是Long
    a.intValue+b.intValue=================>>> int  并不是Integer所以比较的是内容,而不是地址!
      

  7.   

    檢驗了一下,當對常量池數據進行比較的時候,==確實比較的僅僅是值。謝謝!    public static void compareString() {
            String a = new String("a");
            String b = new String("b");
            String ab = new String("ab");
            boolean boo = ab.intern() == (a + b).intern();
            System.out.println(boo);
        }
        
        public static void compareNumber() {
            char a = 'a';
            char b = 'b';
            Long c = 195l;        
            boolean boo = c == (a + b);
            System.out.printf("c=%d,a+b=%d,compare:%s\n", c, a + b, boo);
        }
      

  8.   

    java中的数据类型,可分为两类:  
    1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean  
      他们之间的比较,应用双等号(==),比较的是他们的值。  
    2.复合数据类型(类)  
      当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。