Java整數(shù)池。為什么?
它被稱為Flyweight模式,用于最小化內(nèi)存使用。
這些數(shù)字很可能會被重復(fù)使用,并且類似autoBox的類型Integer是不可變的(請注意,這樣做不僅是針對Integer)。緩存它們可以使實(shí)例不多,并且也減少了GC(垃圾收集)的工作。
JLS在5.1.7中對此進(jìn)行了介紹。裝箱轉(zhuǎn)換專門通過說:
如果裝箱的值p為true,false,字節(jié)或 u0000到u007f范圍內(nèi)的char或-128到127(含)之間的整數(shù)或短數(shù),則令r1和r2為p的任何兩次拳擊轉(zhuǎn)換。r1 == r2總是這樣。
理想情況下,將給定的原始值p裝箱將始終產(chǎn)生相同的參考。實(shí)際上,使用現(xiàn)有的實(shí)現(xiàn)技術(shù)可能不可行。以上規(guī)則是務(wù)實(shí)的妥協(xié)。上面的最后一句要求始終將某些通用值裝在無法區(qū)分的對象中。該實(shí)現(xiàn)可以懶惰地或急切地緩存它們。對于其他值,此公式不允許對程序員方面的帶框值的身份進(jìn)行任何假設(shè)。這將允許(但不要求)共享部分或全部這些引用。
這樣可以確保在最常見的情況下,行為將是理想的,而不會造成不必要的性能損失,尤其是在小型設(shè)備上。例如,較少內(nèi)存限制的實(shí)現(xiàn)可能會緩存所有char和short值,以及-32K到+32K范圍內(nèi)的int和long值。
解決方法我到處都讀到過,當(dāng)您在Java中定義介于-128到127之間的Integer時(shí),它不會創(chuàng)建新對象,而是返回已經(jīng)創(chuàng)建的對象。
除了讓新手程序員比較Integer對象==以查看它們是否具有相同的數(shù)字外,我看不到這樣做的任何意義,但是我認(rèn)為這很糟糕,因?yàn)榇_保他們認(rèn)為可以將任何Integer對象與進(jìn)行比較==,并且還在教學(xué)在任何編程語言中都不好的做法:將兩個(gè)“不同”對象的內(nèi)容與進(jìn)行比較==。
這樣做有其他原因嗎?還是在設(shè)計(jì)語言(以我的觀點(diǎn))(如JavaScript中的可選分號)時(shí)只是一個(gè)錯(cuò)誤的決定?
編輯:我在這里看到他們解釋行為:為什么Integer常量池的行為在127發(fā)生變化?
我在問為什么他們設(shè)計(jì)它具有這種行為,而不是為什么會發(fā)生這種行為。
相關(guān)文章:
1. golang - 用IDE看docker源碼時(shí)的小問題2. docker-machine添加一個(gè)已有的docker主機(jī)問題3. docker images顯示的鏡像過多,狗眼被亮瞎了,怎么辦?4. 運(yùn)行python程序時(shí)出現(xiàn)“應(yīng)用程序發(fā)生異常”的內(nèi)存錯(cuò)誤?5. docker - 如何修改運(yùn)行中容器的配置6. phpstudy8.1沒集成mysql-front7. 我何時(shí)應(yīng)該在Java中使用JFrame.add(component)和JFrame.getContentPane()。add(component)8. 利用IPMI遠(yuǎn)程安裝centos報(bào)錯(cuò)!9. 前端 - @media query 使用出現(xiàn)的問題?10. html5和Flash對抗是什么情況?

網(wǎng)公網(wǎng)安備