成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

教妹學(xué) Java之Intern

開發(fā) 后端
盡管 intern 可以確保所有具有相同內(nèi)容的字符串共享相同的內(nèi)存空間,但也不要爛用 intern,因?yàn)槿魏蔚木彺娉囟际怯写笮∠拗频模荒軣o緣無故就占用了相對稀缺的緩存空間,導(dǎo)致其他字符串沒有坑位可占。

[[403936]]

“哥,你發(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)該對 String 的 intern 徹底理解了才對呀。”

“好是好,但我就是看不懂!”三妹委屈地說,“哥,還是你親自給我講講吧?”

“好吧,上次學(xué)的字符串常量池你都搞清楚了吧?”

“嗯。”三妹微微的點(diǎn)了點(diǎn)頭。

要理解美團(tuán)技術(shù)團(tuán)隊(duì)的這篇文章,你只需要記住這幾點(diǎn)內(nèi)容:

第一,使用雙引號聲明的字符串對象會(huì)保存在字符串常量池中。

第二,使用 new 關(guān)鍵字創(chuàng)建的字符串對象會(huì)先從字符串常量池中找,如果沒找到就創(chuàng)建一個(gè),然后再在堆中創(chuàng)建字符串對象;如果找到了,就直接在堆中創(chuàng)建字符串對象。

第三,針對沒有使用雙引號聲明的字符串對象來說,就像下面代碼中的 s1 那樣:

  1. 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í)候,不管對象在堆中是否已經(jīng)創(chuàng)建,字符串常量池中仍然會(huì)創(chuàng)建一個(gè)內(nèi)容完全相同的新對象;Java 7 之后呢,由于字符串常量池放在了堆中,執(zhí)行 String.intern() 方法的時(shí)候,如果對象在堆中已經(jīng)創(chuàng)建了,字符串常量池中就不需要再創(chuàng)建新的對象了,而是直接保存堆中對象的引用,也就節(jié)省了一部分的內(nèi)存空間。

“三妹,來猜猜這段代碼輸出的結(jié)果吧。”我說。

  1. String s1 = new String("二哥三妹"); 
  2. String s2 = s1.intern(); 
  3. System.out.println(s1 == s2); 

“哥,這我完全猜不出啊,還是你直接解釋吧。”三妹說。

“好吧。”

第一行代碼,字符串常量池中會(huì)先創(chuàng)建一個(gè)“二哥三妹”的對象,然后堆中會(huì)再創(chuàng)建一個(gè)“二哥三妹”的對象,s1 引用的是堆中的對象。

第二行代碼,對 s1 執(zhí)行 intern() 方法,該方法會(huì)從字符串常量池中查找“二哥三妹”這個(gè)字符串是否存在,此時(shí)是存在的,所以 s2 引用的是字符串常量池中的對象。

也就意味著 s1 和 s2 的引用地址是不同的,一個(gè)來自堆,一個(gè)來自字符串常量池,所以輸出的結(jié)果為 false。

“來看一下運(yùn)行結(jié)果。”我說。

  1. false 

“我來畫幅圖,幫助你理解下。”看到三妹驚訝的表情,我耐心地說。

“這下理解了吧?”我問三妹。

“嗯嗯,一下子就豁然開朗了!”三妹說。

“好,我們再來看下面這段代碼。”

  1. String s1 = new String("二哥") + new String("三妹"); 
  2. String s2 = s1.intern(); 
  3. System.out.println(s1 == s2); 

“難道也輸出 false ?”三妹有點(diǎn)不確定。

“不,這段代碼會(huì)輸出 true。”我否定了三妹的猜測。

“為啥呀?”三妹迫切地想要知道答案。

第一行代碼,會(huì)在字符串常量池中創(chuàng)建兩個(gè)對象,一個(gè)是“二哥”,一個(gè)是“三妹”,然后在堆中會(huì)創(chuàng)建兩個(gè)匿名對象“二哥”和“三妹”(可以暫時(shí)忽略),最后還有一個(gè)“二哥三妹”的對象,s1 引用的是堆中“二哥三妹”這個(gè)對象。

第二行代碼,對 s1 執(zhí)行 intern() 方法,該方法會(huì)從字符串常量池中查找“二哥三妹”這個(gè)對象是否存在,此時(shí)不存在的,但堆中已經(jīng)存在了,所以字符串常量池中保存的是堆中這個(gè)“二哥三妹”對象的引用,也就是說,s2 和 s1 的引用地址是相同的,所以輸出的結(jié)果為 true。

“來看一下運(yùn)行結(jié)果。”我胸有成竹地說。

  1. true 

“我再來畫幅圖,幫助你理解下。”

“哇,我明白了!”三妹長舒一口氣,大有感慨 intern 也沒什么難理解的意味。

不過需要注意的是,盡管 intern 可以確保所有具有相同內(nèi)容的字符串共享相同的內(nèi)存空間,但也不要爛用 intern,因?yàn)槿魏蔚木彺娉囟际怯写笮∠拗频模荒軣o緣無故就占用了相對稀缺的緩存空間,導(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)步,我也感到由衷的開心。

本文轉(zhuǎn)載自微信公眾號「沉默王二」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系沉默王二公眾號。

 

責(zé)任編輯:武曉燕 來源: 沉默王二
相關(guān)推薦

2021-05-10 11:38:07

Java數(shù)組IDEA

2020-11-18 09:44:49

Java命名約定

2020-10-26 09:36:45

Java變量數(shù)據(jù)

2021-07-08 22:43:41

ThrowThrowsJava

2021-06-11 18:08:00

Java字符串拼接

2021-07-26 17:22:02

Java

2021-07-03 17:53:52

Java異常處理機(jī)制

2020-10-29 10:28:31

Java數(shù)據(jù)類型

2021-07-30 09:32:55

JavaEquals

2020-11-13 10:29:37

流程控制語句

2020-12-09 05:19:35

static關(guān)鍵字Java

2022-02-16 08:26:18

Go并發(fā)信號量

2018-03-06 10:46:42

代碼Python買水果

2022-10-31 07:33:05

Javafor循環(huán)

2022-10-30 10:14:43

Java循環(huán)語句

2015-03-24 13:28:52

Java Java Strin內(nèi)存模型

2022-09-30 07:32:48

循環(huán)while循環(huán)體

2022-11-26 00:34:57

數(shù)組Java程序

2022-08-05 12:05:07

JavaGuava集合

2020-10-23 07:43:31

String
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久久久久久久久毛片 | 美女久久久久久久久 | 久久中文字幕一区 | 国内精品久久久久 | 久久福利电影 | 国产精品一区二 | 亚洲字幕在线观看 | 日韩中文视频 | 国产免费自拍 | 91性高湖久久久久久久久_久久99 | 欧美一区二区三区视频 | 欧美精品久久久 | 日韩欧美在 | 7799精品视频天天看 | 欧美激情免费在线 | 国产日韩av一区二区 | 精品乱码一区二区三四区视频 | 毛片一级片 | 亚洲狠狠丁香婷婷综合久久久 | 一区二区三区四区不卡视频 | 亚洲第一中文字幕 | 一区二区三区在线免费观看 | 精品国产99 | 天天射色综合 | 久久精品国产一区二区电影 | 国产成人综合在线 | 久久精品欧美一区二区三区麻豆 | 超碰成人免费 | 激情久久久久 | 欧美成人aaa级毛片在线视频 | 毛片99 | 国产玖玖 | 黄网站涩免费蜜桃网站 | 一区二区三区网站 | 91久久久久久久久久久久久 | 亚洲成人av在线播放 | 免费看黄色片 | 免费成年网站 | 天天色天天射天天干 | 九色国产| 亚洲国产精品激情在线观看 |