第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

JDK7中String.Intern()方法的疑問

JDK7中String.Intern()方法的疑問

尚方寶劍之說 2019-09-13 10:37:24
Strings1=newString("aa")+newString("bb");s1.intern();Strings2="aabb";System.out.println(s1==s2);//true我已經(jīng)了解,JDK6中intern()會(huì)在常量池中不存在的情況下直接拷貝值放入常量池,而JDK7是會(huì)把堆中的引用放入常量池。這段代碼中的字面量"aa""bb""aabb"在編譯器就已經(jīng)放入常量池中了,很多文章都說成執(zhí)行到Strings2="aabb"才把“aabb”放入常量池,我認(rèn)為是不對(duì)的。所以在s1.intern()這個(gè)操作應(yīng)該是沒有產(chǎn)生任何副作用的,s1仍然指向堆中的一個(gè)對(duì)象,s2仍然指向常量池中的一個(gè)對(duì)象。但實(shí)際結(jié)果卻為true,而且把Strings2="aabb"移動(dòng)到s1.intern()前面,結(jié)果就是我所預(yù)期的false。到底是為什么呢?
查看完整描述

2 回答

?
慕碼人2483693

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超9個(gè)贊

先說點(diǎn)別的:
這里的字符串拼接沒有被優(yōu)化
"xxx"這樣的字面量聲明自帶intern
不同版本的java效果各種不一樣
一般的用法是Stringx=x.intern(),因?yàn)榭赡軙?huì)返回常量池里的引用
intern屬于用時(shí)間換空間,一般也很少用到…
編譯期沒有字符串常量池,字符串常量池是運(yùn)行期的東西,也就是說直到某個(gè)字符串字面量聲明或者intern之前,這個(gè)字符串不會(huì)進(jìn)入字符串常量池中
再說你這個(gè)例子:
如果s1.intern()發(fā)生在s2的聲明之前,s1進(jìn)常量池,s2的聲明自帶intern,從常量池里找到s1賦值給自己,于是和s1是同一個(gè)引用
反過來,s2先聲明,進(jìn)常量池,s1需要計(jì)算,得到一個(gè)新的字符串,和s2就不是同一個(gè)了,這時(shí)候如果做s1.intern()==s2還是true
                            
查看完整回答
反對(duì) 回復(fù) 2019-09-13
?
翻翻過去那場(chǎng)雪

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊

涉及到更深入的類加載機(jī)制原答案比較混亂,我整理一下就是:1.查看字節(jié)碼文件中可以看到,定義一個(gè)字面量的Strings2="aabb"對(duì)象,其實(shí)是存儲(chǔ)了2個(gè)內(nèi)容,一個(gè)是UTF8aabb,一個(gè)是String對(duì)象指向這個(gè)UTF8,這個(gè)是重點(diǎn),使用常量池中的數(shù)據(jù),實(shí)際使用的是這個(gè)String對(duì)象。2.加載類的時(shí)候會(huì)讀取字節(jié)碼文件中Constantpool里的內(nèi)容放入運(yùn)行期常量池,但這個(gè)時(shí)候只創(chuàng)建了UTF8aabb這個(gè)對(duì)象(C中的Symbol類型),配套的String對(duì)象是懶加載的,只有當(dāng)?shù)谝皇褂玫竭@個(gè)常量的時(shí)候才會(huì)在常量池中去創(chuàng)建這個(gè)String對(duì)象。3.再結(jié)合問題中的代碼,程序開始執(zhí)行后,常量池中已經(jīng)有"aa""bb""aabb"3個(gè)UTF8對(duì)象,但是并沒有可用的String對(duì)象。當(dāng)執(zhí)行完第一行代碼,會(huì)創(chuàng)建常量池中的"aa""bb"的String對(duì)象;當(dāng)程序執(zhí)行到s1.intern();時(shí),常量池中并不存在"aabb"這個(gè)String對(duì)象,于是將s1的引用放入常量池作為String對(duì)象,后面代碼再去常量池獲取這個(gè)字面量的時(shí)候,返回的就是s1的地址,所以s1==s2。4.推測(cè),上面這種情況,類加載時(shí)候創(chuàng)建的"aabb"Symbol對(duì)象就無用了,未證實(shí)。5.當(dāng)先執(zhí)行Strings2="aabb";的時(shí)候,會(huì)直接去常量池中獲取對(duì)象,發(fā)現(xiàn)常量池中的String對(duì)象不存在,于是創(chuàng)建一個(gè),指向常量池中的UTF8aabb對(duì)象。下一步再執(zhí)行在s1.intern();的時(shí)候,發(fā)現(xiàn)常量池中已經(jīng)存在,放不進(jìn)去了,所以結(jié)果是s1指向堆中的一個(gè)對(duì)象,s2指向常量池中的一個(gè)對(duì)象,2者并不相等。
查看完整回答
反對(duì) 回復(fù) 2019-09-13
  • 2 回答
  • 0 關(guān)注
  • 212 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)