Integer和int類型值比較

今天覆習時,遇到了Integer類型與int類型的值比較,就寫了一段代碼來測試一下結果:

public class Test9 {
    public static void main(String[] args) {
        Integer i01 = 12;  
        int i02 = 12;//基本數據類型
        Integer i03 = Integer.valueOf(12);//此處就相當於是Integer i03 =12;
        Integer i04 = new Integer(12);

        System.out.println(i01==i02);//true
        System.out.println(i03==i04);//false
        System.out.println(i01==i04);//false
        System.out.println(i02==i04);//true
        System.out.println(i01==i03);//true
        System.out.println(i02==i03);//true
    }
}

下面我們就來一一說下這些結果的原理吧:
(1)

 System.out.println(i01==i02);//true

Integer i01 = 12;
int i02 = 12;
Integer屬於包裝類,int屬於基本數據類型;
只要Integer和int類型的值進行 == 比較,就會將Integer包裝類拆箱爲int類型,
所以當進行 i01==i02比較時,就相當於兩個int類型的值進行比較;
基本數據類型與基本數據類型進行比較,就是比較值的內容;

(2)

System.out.println(i03==i04);//false

Integer i03 = Integer.valueOf(12); 此處就相當於是Integer i03 =12;
Integer i04 = new Integer(12);

首先,我們要先明確一件事:
對於 Integer var = ? 在-128 至 127 範圍內的賦值,Integer 對象IntegerCache.cache 產生,會複用已有對象,這個區間內的 Integer 值可以直接使用==進行判斷,但是這個區間之外的所有數據,都會在堆上產生,並不會複用已有對象;
i03和i04都是Integer對象,兩個Integer對象進行比較;
i03是一個Integer對象,因爲i03是用直接賦值法產生的對象,它會將該對象放入IntegerCache.cache中,
i04是使用new產生的對象,會重新創建一個堆空間,不會複用IntegerCache.cache中的對象,與 String的直接賦值法創建對象和使用new創建對象一樣的原理;

所以i03==i04的結果爲false;
(3)

  System.out.println(i01==i04);//false

Integer i01 = 12;
Integer i04 = new Integer(12);
該原理與(2)一樣;

(4)

 System.out.println(i02==i04);//true

int i02 = 12;
Integer i04 = new Integer(12);
只要Integer(不管是直接賦值法還是new的)和int類型的值進行 == 比較,就會將Integer包裝類拆箱爲int類型,與(1)一樣;
(5)

 System.out.println(i01==i03);//true

Integer i01 = 12;
Integer i03 = Integer.valueOf(12);相當於 Integer i03=12;

兩個Integer類型進行比較,當創建i01對象時,會將該對象放入IntegerCache.cache中,當創建i03時,因爲不是new創建的,所以會引用IntegerCache.cache中的i01對象,所以i01和i03是指向堆中的同一個對象;
所以結果爲true;
(6)

  System.out.println(i02==i03);//true

int i02 = 12;//基本數據類型
Integer i03 = Integer.valueOf(12);//此處就相當於是Integer i03 =12;
原理和(1)相同;

綜上所述:
(1)對於 Integer var = ? 在-128 至 127 範圍內的賦值,Integer 對象IntegerCache.cache 產生,會複用已有對象,這個區間內的 Integer 值可以直接使用==進行判斷,但是這個區間之外的所有數據,都會在堆上產生,並不會複用已有對象;

(2)只要Integer(不管是直接賦值法還是new的)和int類型的值進行 == 比較,就會將Integer包裝類拆箱爲int類型;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章