關(guān)于java中Int等類型裝箱時(shí)發(fā)生的奇怪現(xiàn)象
問(wèn)題描述
各位朋友,我下面說(shuō)一下我的理解,各位看看是否正確(注意不要瞎延伸,如果我對(duì)就告訴我說(shuō)得是對(duì)的,讓我得到確認(rèn)無(wú)誤。另外如果我錯(cuò)了不要鄙視我,幫忙提出錯(cuò)在哪并給出真正的答案是個(gè)好方法。我在知乎問(wèn)問(wèn)題有人把我鄙視的心理拔涼拔涼的了都):理解1:int,byte,short這幾個(gè)基本類型變量的裝箱操作,底層都有一個(gè)緩沖池(java源碼可以找到實(shí)現(xiàn)),也就是Object a=200; 這樣的操作,就會(huì)創(chuàng)建一個(gè)新對(duì)象裝下200,因?yàn)?00超出了緩沖池。所以每次裝箱都new新的對(duì)象來(lái)包裝200.因此:Object a=200;與Object b=200; 判斷a==b返回false,因?yàn)槠鋋和b不是指向同一個(gè)對(duì)象。而Object a =100與Object b=100 其a和b是指向同一個(gè)對(duì)象。(因?yàn)橛捎诰彺娉貦C(jī)制,導(dǎo)致裝箱的時(shí)候,只從池子中取一個(gè)值為100的對(duì)象返回,所以a和b地址相同,a==b返回true)理解2:同時(shí),裝箱的int,byte,short有個(gè)不可變的特性(就像String類的對(duì)象也具有不可變的性質(zhì))。因此每次改變某個(gè)對(duì)象的值,都是去創(chuàng)建一個(gè)新的對(duì)象,而無(wú)法真正改變緩存池中這個(gè)對(duì)象本身。例如:
Object a=200;Object b=a; //現(xiàn)在a==b返回true
b=201; //想修改b指向的對(duì)象的值,但由于裝箱后的int,short以及String之類的那種不可變性,導(dǎo)致201是創(chuàng)建了一個(gè)新對(duì)象,把地址返回給b。而不是把原來(lái)那個(gè)200對(duì)象改為201.重復(fù):在第二行,a和b是指向同一個(gè)對(duì)象,但是第三行修改b對(duì)象的時(shí)候,由于b對(duì)象的不可修改特性,導(dǎo)致最后結(jié)果是b是指向一個(gè)201的新對(duì)象,a還是指向200的那個(gè)對(duì)象。 也就是說(shuō)裝箱后的基本類型不能再次被改變,只能創(chuàng)建新對(duì)象。(你有改變那個(gè)200對(duì)象本身的辦法嗎)理解3:以上的緩沖池和不可變性適用于String對(duì)象。(雖然String沒(méi)有裝箱,但是String的機(jī)制跟裝箱后的Integger差不多一樣)理解4:裝修后的int,short,byte。以及String類,都有一個(gè)辦法直接去創(chuàng)建新的對(duì)象,而不經(jīng)過(guò)緩存池。那就是new。例如String a="123"; String b="123"; 這樣a和b都指向緩存池中的"123"而String a=new String("123"); 與 String b=new String("123");就不經(jīng)過(guò)緩存池,直接創(chuàng)建了2個(gè)"123"的對(duì)象所以,a==b返回false。
問(wèn)題解答
回答1:String是對(duì)象,沒(méi)有包裝器。
String a = '123';直接把引用指向常量池。而String b = new String(a);是把a(bǔ)的內(nèi)容在堆中復(fù)制一份。
相關(guān)文章:
1. 為什么我ping不通我的docker容器呢???2. android - webview 自定義加載進(jìn)度條3. 將SQLServer數(shù)據(jù)同步到MySQL 用什么方法?4. Docker for Mac 創(chuàng)建的dnsmasq容器連不上/不工作的問(wèn)題5. numpy - python [:,2][:,None]是什么意思6. linux - openSUSE 上,如何使用 QQ?7. javascript - 微信音樂(lè)分享8. mysql優(yōu)化 - 如何解決 MySQL 導(dǎo)入約 2G 的 SQL 報(bào)錯(cuò)?9. javascript - vue引入微信jssdk 配置在哪個(gè)生命周期調(diào)取接口配置?10. javascript - 微信小程序限制加載個(gè)數(shù)
