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,它被存储在一个符号表里,所有的变量都是存在这里的。你百度一下编译原理 符号表,就明白了