原創(chuàng)|行業(yè)資訊|編輯:郝浩|2015-11-19 16:32:25.000|閱讀 3893 次
概述:通過(guò)這個(gè)簡(jiǎn)單的代碼小測(cè)驗(yàn)讓你對(duì)Java有多一點(diǎn)的理解。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
相關(guān)鏈接:
這是我們今天要討論的話(huà)題,因?yàn)槲矣X(jué)得它非常的有趣。
如果你運(yùn)行如下代碼:
Integer a = 1000, b = 1000; System.out.println(a == b);//1 Integer c = 100, d = 100; System.out.println(c == d);//2
你會(huì)得到以下運(yùn)行結(jié)果:
false true
我們知道,如果兩個(gè)引用指向同一個(gè)對(duì)象,那么==就成立;反之,如果兩個(gè)引用指向的不是同一個(gè)對(duì)象,那么==就不成立,即便兩個(gè)引用的內(nèi)容是一樣的。因此,結(jié)果就會(huì)出現(xiàn)false。
這是非常有趣的地方。如果你查看Integer.java類(lèi),你會(huì)找到IntegerCache.java這個(gè)內(nèi)部私有類(lèi),它為-128到127之間的所有整數(shù)對(duì)象提供緩存。
這個(gè)東西為那些數(shù)值比較小的整數(shù)提供內(nèi)部緩存,當(dāng)進(jìn)行如此聲明時(shí):
Integer c = 100;
它的內(nèi)部就是這樣的:
Integer i = Integer.valueOf(100);
如果我們觀察valueOf()類(lèi)函數(shù),我們可以看到
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
如果值在-128到127之間,它就會(huì)返回該緩存的實(shí)例。
因此。。。
Integer c = 100, d = 100;
兩者指向同樣的對(duì)象。
這就是為什么這段代碼的結(jié)果為true了:
System.out.println(c == d);
現(xiàn)在你可能會(huì)問(wèn),為什么會(huì)為-128到127之間的所有整數(shù)設(shè)置緩存?
這是因?yàn)樵谶@個(gè)范圍內(nèi)的小數(shù)值整數(shù)在日常生活中的使用頻率要比其它的大得多,多次使用相同的底層對(duì)象這一特性可以通過(guò)該設(shè)置進(jìn)行有效的內(nèi)存優(yōu)化。你可以使用reflection API任意使用這個(gè)功能。
運(yùn)行下面的這段代碼,你就會(huì)明白它的神奇所在了。
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { Class cache = Integer.class.getDeclaredClasses()[0]; //1 Field myCache = cache.getDeclaredField("cache"); //2 myCache.setAccessible(true);//3 Integer[] newCache = (Integer[]) myCache.get(cache); //4 newCache[132] = newCache[133]; //5 int a = 2; int b = a + a; System.out.printf("%d + %d = %d", a, a, b); // }
本文翻譯自,由回憶和感動(dòng)翻譯,轉(zhuǎn)載請(qǐng)注明文章來(lái)自慧都控件網(wǎng)。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn