非原創:引自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了