【原創(chuàng)】為什么1000==1000為false而100==100為true

今天在書(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)存占用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評(píng)論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,653評(píng)論 18 399
  • java筆記第一天 == 和 equals ==比較的比較的是兩個(gè)變量的值是否相等,對(duì)于引用型變量表示的是兩個(gè)變量...
    jmychou閱讀 1,645評(píng)論 0 3
  • 【內(nèi)容摘要】 技術(shù)背景的項(xiàng)目形式風(fēng)格偏硬,喜歡擼起袖子自己干,往往不注意軟技能的修煉。而非技術(shù)背景的項(xiàng)目經(jīng)理往往行...
    郭致星閱讀 1,031評(píng)論 3 21
  • 感賞今天的天氣真好,早上起床送兒子上學(xué),老公摟著耍賴,就不讓起床。我說(shuō)送我兒子再回來(lái)陪你。 感賞兒子今天心情也很好...
    連娟a閱讀 148評(píng)論 0 0

友情鏈接更多精彩內(nèi)容