日期:2014-05-20  浏览次数:20736 次

Integer 和 int 的比较
public class Test {
public static void main(String[] args) {
Integer a = 222; 
int d = 222;
System.out.println(d == a);
System.out.println(a == d);
}
}

输出:
 true
 true

个人 理解:
   int是基本数据类型,Integer是引用数据类型,a的地址和d的地址应该是不一样的
   
   但是我看过这样的理解可以证明d==a是ture:说拿 int==Integer时,Integer会自动拆箱,然后回去从栈中是否有那个int 类型的值,如果有则获得该地址,所以就等于true了。
  可是按这种说法来看,Integer==int,int会自动装箱变成引用数据类型,但是堆内存是不共享的,地址又怎会一样呢????

求高手指教
      

------解决方案--------------------
反编译一下就知道了
编译器优化了
其实是调用了Integer.intValue方法16行和34行
public static void main(java.lang.String[]);
  Code:
   Stack=3, Locals=3, Args_size=1
   0:   sipush  222
   3:   invokestatic    #2; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Int
eger;
   6:   astore_1
   7:   sipush  222
   10:  istore_2
   11:  getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;
   14:  iload_2
   15:  aload_1
   16:  invokevirtual   #4; //Method java/lang/Integer.intValue:()I
   19:  if_icmpne       26
   22:  iconst_1
   23:  goto    27
   26:  iconst_0
   27:  invokevirtual   #5; //Method java/io/PrintStream.println:(Z)V
   30:  getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;
   33:  aload_1
   34:  invokevirtual   #4; //Method java/lang/Integer.intValue:()I
   37:  iload_2
   38:  if_icmpne       45
   41:  iconst_1
   42:  goto    46
   45:  iconst_0
   46:  invokevirtual   #5; //Method java/io/PrintStream.println:(Z)V
   49:  return
  LineNumberTable:
   line 3: 0
   line 4: 7
   line 5: 11
   line 6: 30
   line 7: 49
------解决方案--------------------
引用:
7楼的说法我不太认同,我认为
int a =10;
前提是栈内存中没有10,
应该是先在栈中开辟空间保存10这个值,
然后再开辟一个空间名叫a指向保存10的那块内存的地址。
这应该是俩快空间,但都是在栈中。
所以==一定是比较地址的,何来比较值的说法


不是这样的。  只有10是存在栈里的,至于那个a,它被存储在一个符号表里,所有的变量都是存在这里的。你百度一下编译原理 符号表,就明白了