今天在書(shū)上忽然看到了這樣的一個(gè)問(wèn)題,1000==1000為false,而100==100為true,心中不禁疑惑,特地上網(wǎng)查詢,發(fā)現(xiàn)還是自己孤陋寡聞了。特地來(lái)與大家分享一下。
如果在你的eclipse中運(yùn)行這樣一段代碼

你會(huì)得到false,
但是如果把1000改成100,將會(huì)得到不一樣的結(jié)果。

你會(huì)得到結(jié)果 true
基本知識(shí):我們知道,如果兩個(gè)引用指向同一個(gè)對(duì)象,用==表示它們是相等的。如果兩個(gè)引用指向不同的對(duì)象,用==表示它們是不相等的,即使它們的內(nèi)容相同。
因此,按正常來(lá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ì)象
這就是為什么我們寫(xiě)
syso(a==b)
結(jié)果是true的原因。
現(xiàn)在你可能會(huì)問(wèn),為什么這里需要緩存?
合乎邏輯的理由是,在此范圍內(nèi)的“小”整數(shù)使用率比大整數(shù)要高,因此,使用相同的底層對(duì)象是有價(jià)值的,可以減少潛在的內(nèi)存占用。