上面的一篇提到過,為什麼Java泛型為什麼要用物件而不是原始型別?但對Integer和int這兩個的差別還是不怎麼懂,就繼續百度了一下,找到了一篇大佬的文章,感覺還是不錯的,就轉載分享一下。
Integer和int的區別
Integer是int提供的封裝類,而int是Java的基本資料型別;Integer 預設值是null,而int預設值是0; 宣告為Integer的變數需要實例化,而宣告為int的變數不需要實例化;Integer是對象,用一個引用指向這個對象,而int是基本類型,直接儲存數值。
除了知道Integer和int最基本的差異外,還需要了解一點其他關於Integer和int實際使用中的回遇到的問題。
否則如果面試官再問一下Integer i = 1;int ii = 1; i==ii為true還是為false?估計就有一部分人答不出來了,如果再問其他的,估計更多的人會頭腦一片混亂。所以我對它們做了總結,希望對大家有幫助。
程式碼如下:
public class Main { public static void main(String[] args) { int a = 128; Integer b = 127; Integer c = 127; Integer d = 128; Integer e = 128; Integer f = new Integer("128"); Integer g = new Integer("127"); Integer h = new Integer("127"); //方案一() System.out.println("方案一:Integer与new Integer不同初始化方法的值的比较,Integer与new Integer不会相等"); //Integer e = 128; //Integer f = new Integer("128"); if (e == f){ System.out.println("true"); }else{ System.out.println("false"); } System.out.println("---------------------"); //方案二 System.out.println("方案二:创建两个都是直接赋值的Integer"); //Integer b = 127; //Integer c = 127; if (b == c){ System.out.println("true"); }else{ System.out.println("false"); } //Integer d = 128; //Integer e = 128; if (d == e){ System.out.println("true"); }else{ System.out.println("false"); } System.out.println("---------------------"); //方案三 System.out.println("方案三:两个都是new出来的Integer"); //Integer g = new Integer("127"); //Integer h = new Integer("127"); if (g == h){ System.out.println("true"); }else{ System.out.println("false"); } System.out.println("---------------------"); //方案四 System.out.println("方案四:int与Integer比较"); //int a = 128; //Integer f = new Integer("128"); if (a == f){ System.out.println("true"); }else{ System.out.println("false"); } } }
運行結果如下:
方案一:Integer与new Integer不同初始化方法的值的比较,Integer与new Integer不会相等 false --------------------- 方案二:创建两个都是直接赋值的Integer true false --------------------- 方案三:两个都是new出来的Integer false --------------------- 方案四:int与Integer比较 true
方案一:
我先對e、f這兩個對象,使用Integer和new Integer這兩個不同的初始化方法,在對這兩個物件進行比較;
Integer e = 128; Integer f = new Integer("128"); if (e == f){ System.out.println("true"); }else{ System.out.println("false"); }
返回結果:false
得出結論:Integer與new Integer不會相等。 e的引用指向堆,而f指向專門存放他的記憶體(常數池),他們的記憶體位址不一樣,所以為false
方案二:
創建兩個都是直接賦值的Integer,在對這兩個物件進行比較;
//Integer b = 127; //Integer c = 127; if (b == c){ System.out.println("true"); }else{ System.out.println("false"); } //Integer d = 128; //Integer e = 128; if (d == e){ System.out.println("true"); }else{ System.out.println("false"); }
#回傳結果:
true
false
得出結論:兩個都是直接賦值的Integer,如果數在-128到127之間,則是true,否則為false
原因: java在編譯Integer i2 = 128的時候,被翻譯成-> Integer i2 = Integer.valueOf(128) ;而valueOf()函數會對-128到127之間的數進行緩存
看一下源碼大家都會明白,對於-128到127之間的數,會進行緩存,Integer b = 127時,會將127進行緩存,下次再寫Integer c = 127時,就會直接從緩存取,就不會new了。
/** * Cache to support the object identity semantics of autoboxing for values between * -128 and 127 (inclusive) as required by JLS. * * The cache is initialized on first usage. The size of the cache * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option. * During VM initialization, java.lang.Integer.IntegerCache.high property * may be set and saved in the private system properties in the * sun.misc.VM class. */ private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } catch( NumberFormatException nfe) { // If the property cannot be parsed into an int, ignore it. } } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; } private IntegerCache() {} }
方案三:
我先對g、h這兩個對象,使用new Integer初始化方法,在對這兩個對象進行比較;
Integer g = new Integer("127"); Integer h = new Integer("127"); if (g == h){ System.out.println("true"); }else{ System.out.println("false"); }
返回結果:false
得出結論:兩個都是new出來的Integer對象,指向不同的兩個Integer對象,都為false
方案四:
我先對a 、f這兩個對象,使用int和new Integer這兩個不同的初始化方法,在對這兩個對象進行比較;
int a = 128; Integer f = new Integer("128"); if (a == f){ System.out.println("true"); }else{ System.out.println("false"); }
返回結果:true
得出結論: int和integer(無論new否)比,都為true,因為會把Integer自動拆箱為int再去比
相關文章:
以上是總結Java中的Integer和int的差異詳細解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!