關於 new integer 和integer.valueOf() 和 int 的比較

有一個面試題:

求打印結果

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 原理同上。

發佈了10 篇原創文章 · 獲贊 2 · 訪問量 1416
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章