有一個面試題:
求打印結果
public static void main(String[] args) {
Integer a = new Integer(100);
Integer b = 100;
int c = 100;
Integer d = new Integer(100);
System.out.println(a == d);
System.out.println(a == b);
System.out.println(a == c);
System.out.println(b == c);
System.out.println(c == d);
}
首先看這幾個的創建方式 Integer a = new Integer(100);
我來看一下字節碼
Integer b = 100;
int c = 100;
Integer d = new Integer(100);
0: new #2 // class java/lang/Integer
3: dup
4: bipush 100
6: invokespecial #3 // Method java/lang/Integer."<init>":(I)V
9: astore_1
10: bipush 100
12: invokestatic #4 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
15: astore_2
16: bipush 100
18: istore_3
19: new #2 // class java/lang/Integer
22: dup
23: bipush 100
25: invokespecial #3 // Method java/lang/Integer."<init>":(I)V
28: astore 4
第一個對象
Integer a = new Integer(100);
這段的操作過程就是 1,爲Integer的實例對象分配內存空間並將地址壓入棧頂。2,將對象地址再一次壓入棧頂。3,將常量壓入棧中。4,調用對象的init 方法從棧頂取出參數和this引用實例化對象,放入棧幀的局部變量表。
第二個對象
Integer b = 100;
1,將常量壓入棧中。2,調用Integer的靜態方法valueOf()對對象進行初始化。3,將引用放入局部變量表。
關於對象的valueOf()方法中,如果傳進的值在 -128~127之間的話,獲取這個區間相同值得對象引用是同一個,只被創建一次,所以當兩個相同的Integer a = X , Integer b = X。只要X在這個區間,a==b爲true。
第三個對象
int c = 100;
就是將常量放入了局部變量表中
看完這個應該就知道比對結果了,棧對比結果時,就是操作數棧對局部常量表的數據進行值比較
a==b 就是兩個對象的引用比較,可以理解爲兩個指向不同內存空間的指針在比較,結果肯定爲false。
a==c 這就涉及基本數據類型和對應的包裝類比較時對象自動拆箱,所以就是兩個值得比較,結果爲true。
b==c 原理同上。