91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java之Intern詳解

發布時間:2021-06-15 14:55:00 來源:億速云 閱讀:461 作者:chen 欄目:編程語言

這篇文章主要介紹“Java之Intern詳解”,在日常操作中,相信很多人在Java之Intern詳解問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java之Intern詳解”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

“哥,你發給我的那篇文章我看了,結果直接把我給看得不想學 Java 了!”三妹氣沖沖地說。

“哪一篇啊?”看著三妹面色沉重,我關心地問到。

“就是美團技術團隊深入解析 String.intern() 那篇啊!”三妹回答。

https://tech.meituan.com/2014/03/06/in-depth-understanding-string-intern.html

“哦,我想起來了,不挺好一篇文章嘛,深入淺出,精品中的精品,看完后你應該對 String 的 intern 徹底理解了才對呀。”

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

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

“嗯。”三妹微微的點了點頭。

要理解美團技術團隊的這篇文章,你只需要記住這幾點內容:

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

第二,使用 new  關鍵字創建的字符串對象會先從字符串常量池中找,如果沒找到就創建一個,然后再在堆中創建字符串對象;如果找到了,就直接在堆中創建字符串對象。

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

String s1 = new String("二哥") + new String("三妹");

如果想把 s1 的內容也放入字符串常量池的話,可以調用 intern() 方法來完成。

不過,需要注意的是,Java 7 的時候,字符串常量池從永久代中移動到了堆中,雖然此時永久代還沒有完全被移除。Java 8  的時候,永久代被徹底移除。

這個變化也直接影響了 String.intern() 方法在執行時的策略,Java 7 之前,執行 String.intern()  方法的時候,不管對象在堆中是否已經創建,字符串常量池中仍然會創建一個內容完全相同的新對象;Java 7 之后呢,由于字符串常量池放在了堆中,執行  String.intern()  方法的時候,如果對象在堆中已經創建了,字符串常量池中就不需要再創建新的對象了,而是直接保存堆中對象的引用,也就節省了一部分的內存空間。

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

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

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

“好吧。”

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

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

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

“來看一下運行結果。”我說。

false

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

Java之Intern詳解

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

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

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

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

“難道也輸出 false ?”三妹有點不確定。

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

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

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

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

“來看一下運行結果。”我胸有成竹地說。

true

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

Java之Intern詳解

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

不過需要注意的是,盡管 intern 可以確保所有具有相同內容的字符串共享相同的內存空間,但也不要爛用  intern,因為任何的緩存池都是有大小限制的,不能無緣無故就占用了相對稀缺的緩存空間,導致其他字符串沒有坑位可占。

另外,字符串常量池本質上是一個固定大小的  StringTable,如果放進去的字符串過多,就會造成嚴重的哈希沖突,從而導致鏈表變長,鏈表變長也就意味著字符串常量池的性能會大幅下降,因為要一個一個找是需要花費時間的。

“好了,三妹,關于 String 的 intern 就講到這吧,這次理解了吧?”我問。

“哥,你真棒!”

看到三妹一點一滴的進步,我也感到由衷的開心。

到此,關于“Java之Intern詳解”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

晋州市| 贵州省| 全椒县| 鄱阳县| 纳雍县| 乐业县| 六枝特区| 灌阳县| 乳山市| 鄂尔多斯市| 托里县| 吴忠市| 淳安县| 丰原市| 通山县| 浮山县| 防城港市| 新竹市| 黎川县| 民乐县| 兖州市| 义乌市| 桂平市| 乡城县| 瑞丽市| 山丹县| 阳江市| 宁远县| 南昌市| 通榆县| 锡林浩特市| 富锦市| 晋州市| 鲁甸县| 昌乐县| 金寨县| 南涧| 清新县| 余姚市| 平遥县| 江永县|