這篇文章主要介紹“Java之Intern詳解”,在日常操作中,相信很多人在Java之Intern詳解問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”Java之Intern詳解”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括鎮(zhèn)巴網(wǎng)站建設(shè)、鎮(zhèn)巴網(wǎng)站制作、鎮(zhèn)巴網(wǎng)頁制作以及鎮(zhèn)巴網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,鎮(zhèn)巴網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到鎮(zhèn)巴省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
“哥,你發(fā)給我的那篇文章我看了,結(jié)果直接把我給看得不想學(xué) Java 了!”三妹氣沖沖地說。
“哪一篇啊?”看著三妹面色沉重,我關(guān)心地問到。
“就是美團(tuán)技術(shù)團(tuán)隊(duì)深入解析 String.intern() 那篇啊!”三妹回答。
https://tech.meituan.com/2014/03/06/in-depth-understanding-string-intern.html
“哦,我想起來了,不挺好一篇文章嘛,深入淺出,精品中的精品,看完后你應(yīng)該對(duì) String 的 intern 徹底理解了才對(duì)呀?!?/p>
“好是好,但我就是看不懂!”三妹委屈地說,“哥,還是你親自給我講講吧?”
“好吧,上次學(xué)的字符串常量池你都搞清楚了吧?”
“嗯?!比梦⑽⒌狞c(diǎn)了點(diǎn)頭。
要理解美團(tuán)技術(shù)團(tuán)隊(duì)的這篇文章,你只需要記住這幾點(diǎn)內(nèi)容:
第一,使用雙引號(hào)聲明的字符串對(duì)象會(huì)保存在字符串常量池中。
第二,使用 new 關(guān)鍵字創(chuàng)建的字符串對(duì)象會(huì)先從字符串常量池中找,如果沒找到就創(chuàng)建一個(gè),然后再在堆中創(chuàng)建字符串對(duì)象;如果找到了,就直接在堆中創(chuàng)建字符串對(duì)象。
第三,針對(duì)沒有使用雙引號(hào)聲明的字符串對(duì)象來說,就像下面代碼中的 s1 那樣:
String s1 = new String("二哥") + new String("三妹");
如果想把 s1 的內(nèi)容也放入字符串常量池的話,可以調(diào)用 intern() 方法來完成。
不過,需要注意的是,Java 7 的時(shí)候,字符串常量池從永久代中移動(dòng)到了堆中,雖然此時(shí)永久代還沒有完全被移除。Java 8 的時(shí)候,永久代被徹底移除。
這個(gè)變化也直接影響了 String.intern() 方法在執(zhí)行時(shí)的策略,Java 7 之前,執(zhí)行 String.intern() 方法的時(shí)候,不管對(duì)象在堆中是否已經(jīng)創(chuàng)建,字符串常量池中仍然會(huì)創(chuàng)建一個(gè)內(nèi)容完全相同的新對(duì)象;Java 7 之后呢,由于字符串常量池放在了堆中,執(zhí)行 String.intern() 方法的時(shí)候,如果對(duì)象在堆中已經(jīng)創(chuàng)建了,字符串常量池中就不需要再創(chuàng)建新的對(duì)象了,而是直接保存堆中對(duì)象的引用,也就節(jié)省了一部分的內(nèi)存空間。
“三妹,來猜猜這段代碼輸出的結(jié)果吧?!蔽艺f。
String s1 = new String("二哥三妹"); String s2 = s1.intern(); System.out.println(s1 == s2);
“哥,這我完全猜不出啊,還是你直接解釋吧?!比谜f。
“好吧?!?/p>
第一行代碼,字符串常量池中會(huì)先創(chuàng)建一個(gè)“二哥三妹”的對(duì)象,然后堆中會(huì)再創(chuàng)建一個(gè)“二哥三妹”的對(duì)象,s1 引用的是堆中的對(duì)象。
第二行代碼,對(duì) s1 執(zhí)行 intern() 方法,該方法會(huì)從字符串常量池中查找“二哥三妹”這個(gè)字符串是否存在,此時(shí)是存在的,所以 s2 引用的是字符串常量池中的對(duì)象。
也就意味著 s1 和 s2 的引用地址是不同的,一個(gè)來自堆,一個(gè)來自字符串常量池,所以輸出的結(jié)果為 false。
“來看一下運(yùn)行結(jié)果?!蔽艺f。
false
“我來畫幅圖,幫助你理解下?!笨吹饺皿@訝的表情,我耐心地說。
“這下理解了吧?”我問三妹。
“嗯嗯,一下子就豁然開朗了!”三妹說。
“好,我們?cè)賮砜聪旅孢@段代碼?!?/p>
String s1 = new String("二哥") + new String("三妹"); String s2 = s1.intern(); System.out.println(s1 == s2);
“難道也輸出 false ?”三妹有點(diǎn)不確定。
“不,這段代碼會(huì)輸出 true?!蔽曳穸巳玫牟聹y。
“為啥呀?”三妹迫切地想要知道答案。
第一行代碼,會(huì)在字符串常量池中創(chuàng)建兩個(gè)對(duì)象,一個(gè)是“二哥”,一個(gè)是“三妹”,然后在堆中會(huì)創(chuàng)建兩個(gè)匿名對(duì)象“二哥”和“三妹”(可以暫時(shí)忽略),最后還有一個(gè)“二哥三妹”的對(duì)象,s1 引用的是堆中“二哥三妹”這個(gè)對(duì)象。
第二行代碼,對(duì) s1 執(zhí)行 intern() 方法,該方法會(huì)從字符串常量池中查找“二哥三妹”這個(gè)對(duì)象是否存在,此時(shí)不存在的,但堆中已經(jīng)存在了,所以字符串常量池中保存的是堆中這個(gè)“二哥三妹”對(duì)象的引用,也就是說,s2 和 s1 的引用地址是相同的,所以輸出的結(jié)果為 true。
“來看一下運(yùn)行結(jié)果。”我胸有成竹地說。
true
“我再來畫幅圖,幫助你理解下?!?/p>
“哇,我明白了!”三妹長舒一口氣,大有感慨 intern 也沒什么難理解的意味。
不過需要注意的是,盡管 intern 可以確保所有具有相同內(nèi)容的字符串共享相同的內(nèi)存空間,但也不要爛用 intern,因?yàn)槿魏蔚木彺娉囟际怯写笮∠拗频?,不能無緣無故就占用了相對(duì)稀缺的緩存空間,導(dǎo)致其他字符串沒有坑位可占。
另外,字符串常量池本質(zhì)上是一個(gè)固定大小的 StringTable,如果放進(jìn)去的字符串過多,就會(huì)造成嚴(yán)重的哈希沖突,從而導(dǎo)致鏈表變長,鏈表變長也就意味著字符串常量池的性能會(huì)大幅下降,因?yàn)橐粋€(gè)一個(gè)找是需要花費(fèi)時(shí)間的。
“好了,三妹,關(guān)于 String 的 intern 就講到這吧,這次理解了吧?”我問。
“哥,你真棒!”
看到三妹一點(diǎn)一滴的進(jìn)步,我也感到由衷的開心。
到此,關(guān)于“Java之Intern詳解”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
文章題目:Java之Intern詳解
分享網(wǎng)址:http://jinyejixie.com/article26/pgiicg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、用戶體驗(yàn)、網(wǎng)頁設(shè)計(jì)公司、標(biāo)簽優(yōu)化、外貿(mào)建站、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)