這篇文章主要為大家展示了“java中Integer包裝類(lèi)裝箱的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“java中Integer包裝類(lèi)裝箱的示例分析”這篇文章吧。
專(zhuān)注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)桐廬免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000+企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。前言
java有八個(gè)基本數(shù)據(jù)類(lèi)型,每個(gè)都有對(duì)應(yīng)的一個(gè)包裝類(lèi),比如int對(duì)應(yīng)的Integer。 Integer 是int的包裝類(lèi)型,數(shù)據(jù)類(lèi)型是類(lèi),初值為null,從jdk1.5開(kāi)始,java引入了自動(dòng)拆裝箱,可以直接進(jìn)行形如Integer i = 20
形式的賦值,編譯器會(huì)自動(dòng)將其轉(zhuǎn)換為Integer i = Integer.valueOf(20)
進(jìn)行裝箱,拆箱則是將int j = i的形式轉(zhuǎn)換成了int j = i.intValue()
。
裝箱有個(gè)細(xì)節(jié),如果不注意很容易出錯(cuò),來(lái)看一下:
Integer i = 20; Integer j = Integer.valueOf(20); System.out.println(i == j);
上面的代碼輸出為
true
好像沒(méi)什么問(wèn)題,那我們形式不變,將數(shù)字20換成200,即
i = 200; j = Integer.valueOf(200); System.out.println(i == j);
同樣的判斷,輸出變成了:
false
這是為什么呢?
先明確一點(diǎn),經(jīng)過(guò)編譯器編譯后,Integer i = 20
轉(zhuǎn)換成了Integer i = Integer.valueOf(20)
,和Integer j = Integer.valueOf(20)
的定義完全一樣,那為什么將20換成了200后判斷結(jié)果不一樣了呢?
我們來(lái)看看Integer.valueOf(int i)
方法的內(nèi)部:
public static Integer valueOf(int i) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
可以看出當(dāng)i在某個(gè)區(qū)間內(nèi)時(shí),直接返回了緩存數(shù)組IntegerCache.cache
中的一個(gè)值,超出區(qū)間才new一個(gè)新的Integer對(duì)象。到這里我們大概就可以得出結(jié)論:20在緩存范圍內(nèi)所以直接用了緩存,但是200超出了緩存區(qū)間所以new了新對(duì)象,和原來(lái)對(duì)象的地址當(dāng)然不會(huì)相同,所以返回false
再來(lái)看看IntegerCache,這是一個(gè)Integer的私有靜態(tài)內(nèi)部類(lèi),定義如下:
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) { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low)); } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); } private IntegerCache() {} }
可以看出默認(rèn)的緩存區(qū)間是-128~127,那么什么情況下會(huì)修改這個(gè)范圍呢,修改了某個(gè)虛擬機(jī)參數(shù)的時(shí)候,通過(guò)代碼也可看出,設(shè)置的這個(gè)緩存上限java.lang.Integer.IntegerCache.high
值不能小于127,小于的話就會(huì)被賦予127,從而失效。
那么這個(gè)值怎么設(shè)置呢?我們來(lái)看看jdk源碼中怎么解釋IntegerCache這個(gè)靜態(tài)內(nèi)部類(lèi):
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 -XX:AutoBoxCacheMax= 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.
大概意思是:
將-128到127(包含)的數(shù)字做緩存以供自動(dòng)裝箱使用。緩存在第一次使用時(shí)被初始化。大小可以由JVM參數(shù)-xx:autoboxcachemax=option來(lái)指定。JVM初始化時(shí)此值被設(shè)置成java.lang.Integer.IntegerCache.high屬性并作為私有的系統(tǒng)屬性保存在sun.misc.vm.class中。
可以得到結(jié)論:這個(gè)緩存的high值是由JVM參數(shù) -XX:AutoBoxCacheMax= option來(lái)指定的。
上述jdk源碼來(lái)源于jdk1.7,不同版本實(shí)現(xiàn)略有不同,但思路一致。
這種共享常用對(duì)象的思路有一個(gè)名字,叫享元模式,英文名叫Flyweight,即共享的輕量級(jí)元素。其他包裝類(lèi)如Boolean、Byte、Short、Long、Charactor都有類(lèi)似的實(shí)現(xiàn)。
以上是“java中Integer包裝類(lèi)裝箱的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!