int 與Integer的區別

非原創:引自https://www.cnblogs.com/guodongdidi/p/6953217.htmlhtml

1.Integer是int的包裝類,int是java的一種數據類型java

2.Integer的變量必須實例化後才能使用,而int變量不須要緩存

3.Integer實際是對象的引用,當new一個Integer時,其實是生成一個指針指向此對象;而int 是直接存儲數據值翻譯

4.Integer的默認值是null,int的默認值是0指針

關於Integer和int的比較htm

1.因爲Integer變量其實是對一個Integer對象的引用,因此兩個經過new生成的Integer變量永遠不相等(由於new生成的是兩個對象,其內存地址不一樣)對象

Integer i= new Integer(100);blog

Integer j= new Integer(100);內存

System.out.print(i==j);//false編譯

2.Integer 與int 變量進行比較時,只要兩個變量的值是相等的,則結果爲true,這是由於包裝類Integer與基本數據類型int比較時,java會自動拆包裝爲int,而後進行比較,實際上就變爲兩個int的比較。

int i= 100;

Integer j= new Integer(100);

System.out.print(i==j);//true

3.非new生成的Integer變量和new Integer()生成的變量比較時,結果爲false。這是由於非new生成的Integer變量指向的是java常量池中的對象,而new Integer()生成的變量指向的堆中新建的對象,二者在內存中的地址不一樣。

Integer i = new Integer(100);

Integer j = 100;

System.out.print(i==j);//false

4.對於兩個非new生成的Integer對象,進行比較時,若是兩個變量的值在區間-128到127之間,則比較結果爲true,若是兩個變量不在此區間,則結果爲false。

Integer i=100;

Integer j=100;

System.out.print(i==j);//true

 

Integer i=128;

Integer j=128;

System.out.print(i==j);//false

這是由於java在編譯Integer i= 100;時會翻譯爲Integer i=Integer.valueOf(100);

而javaApI中對Integer類型的valueOf的定義以下:

public static  Integer valueOf(int i){

    assert IntegerCache.high >=127;

if(i>=IntegerCache.low && i <=IntegerCahce.high){

return IntegerCaahe.Cache[i + (-IntegerCache.Low)];

}

return new Integer(i);

}

java對-128到127之間的數會進行緩存,Integer i=127時,會將127進行緩存,下次再寫Integer j = 127時,會直接從緩存中讀取,就不須要new了

相關文章
相關標籤/搜索