今天在書上忽然看到了這樣的一個(gè)問題惩歉,1000==1000為false,而100==100為true裁奇,心中不禁疑惑桐猬,特地上網(wǎng)查詢,發(fā)現(xiàn)還是自己孤陋寡聞了框喳。特地來與大家分享一下课幕。
如果在你的eclipse中運(yùn)行這樣一段代碼
你會(huì)得到false厦坛,
但是如果把1000改成100五垮,將會(huì)得到不一樣的結(jié)果乍惊。
你會(huì)得到結(jié)果 true
基本知識(shí):我們知道,如果兩個(gè)引用指向同一個(gè)對(duì)象放仗,用==表示它們是相等的润绎。如果兩個(gè)引用指向不同的對(duì)象,用==表示它們是不相等的诞挨,即使它們的內(nèi)容相同莉撇。
因此,按正常來推理的話惶傻,第二個(gè)結(jié)果應(yīng)該也是false棍郎。
這就是它有趣的地方了。如果你看去看 Integer.Java類银室,你會(huì)發(fā)現(xiàn)有一個(gè)內(nèi)部私有類涂佃,IntegerCache.java,它緩存了從-128到127之間的所有的整數(shù)對(duì)象蜈敢。
所以事情就成了辜荠,所有的小整數(shù)在內(nèi)部緩存,然后當(dāng)我們聲明類似——
Integer a = 100;
時(shí)抓狭,它實(shí)際在內(nèi)部做的是
Integer a = Integer.valueOf(100);
現(xiàn)在伯病,如果我們?nèi)タ磛alueOf()方法,我們可以看到
如果值的范圍在-128到127之間否过,它就從高速緩存返回實(shí)例午笛。
所以…
Integer a = 100;
和
Integer b =100;
指向了同一個(gè)對(duì)象
這就是為什么我們寫
syso(a==b)
結(jié)果是true的原因。
現(xiàn)在你可能會(huì)問苗桂,為什么這里需要緩存药磺?
合乎邏輯的理由是,在此范圍內(nèi)的“小”整數(shù)使用率比大整數(shù)要高誉察,因此与涡,使用相同的底層對(duì)象是有價(jià)值的,可以減少潛在的內(nèi)存占用持偏。