一文搞懂String的intern()方法
一. 先來(lái)一段代碼
我們先上一段代碼:
String str1 = new StringBuilder("你好").append("renr").toString(); String str2 = "你好renr"; System.out.println(str3 == str4);
大家猜猜上面代碼的輸出結(jié)果是什么?true還是false?
321,你猜對(duì)了嗎?
這里的輸出結(jié)果是:false!
二. String的intern()方法詳解
上面的結(jié)果是為什么呢?為了搞清楚這個(gè)問(wèn)題,我們看看需要了解一下intern()方法的內(nèi)部原理。其實(shí)大家可以將String的intern()方法 , 理解為 是 一 個(gè)可以 手動(dòng)將字符串加入常量池中的方法。
在上述代碼中,我們知道 "=="比較的是對(duì)象的地址, 而 輸出 結(jié)果為 false, 這就 說(shuō)明str1和str2的地址不同。而str 2 引用的字符串"你好renr"肯定是放在常量池中的,這就說(shuō)明str1引用的字符串不在常量池中,而是在堆中。 對(duì)于上述現(xiàn)象,我們可以按照下圖所示進(jìn)行理解:
三. 修改代碼后再看結(jié)果
我們可以對(duì)上述代碼進(jìn)行修改,接著再來(lái)看一下執(zhí)行結(jié)果,代碼如下:
String str3 = new StringBuilder("你好").append("renr").toString(); System.out.println(str3.intern() == str3); String str4 = "你好renr"; System.out.println(str3 == str4);
現(xiàn)在你再來(lái)猜一下上面代碼的輸出結(jié)果,會(huì)分別輸出什么?
321,我們來(lái)公布結(jié)果,這次輸出的結(jié)果為:
true true
來(lái)來(lái)來(lái),再來(lái)給你解釋一下:
執(zhí)行str3.intern()后,str3==str4返回true,這就說(shuō)明str3和str4引用了同一對(duì)象 地址 。
上面我們提到,new StringBuilder("你好").append("renr").toString()
得到的字符串存放在堆中,執(zhí)行str3.intern()后,會(huì)將str3的對(duì)象引用放入 到 常量池中 ( jdk1.7后 ) 。
而對(duì)str4進(jìn)行賦值時(shí),發(fā)現(xiàn)常量池中已經(jīng)有了該字符串的引用,則 會(huì) 將該引用值直接賦值給str4, 所以 str4也指向 了 str3的對(duì)象 ,故 最后輸出 結(jié)果為 true !
四. 總結(jié)
通過(guò)對(duì)上面代碼的解釋?zhuān)F(xiàn)在你搞懂了intern()方法的執(zhí)行原理了嗎?現(xiàn)在請(qǐng)你要記得,intern()的作用就是就是直接將字符串添加到常量池!好了,本篇到此為止。
以上就是一文搞懂String的intern()方法的詳細(xì)內(nèi)容,更多關(guān)于String intern()方法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Spring Cloud Gateway 數(shù)據(jù)庫(kù)存儲(chǔ)路由信息的擴(kuò)展方案
這篇文章主要介紹了詳解Spring Cloud Gateway 數(shù)據(jù)庫(kù)存儲(chǔ)路由信息的擴(kuò)展方案,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11Eclipse中安裝反編譯工具Fernflower的方法(Enhanced Class Decompiler)
這篇文章主要介紹了Eclipse中安裝反編譯工具Fernflower的方法(Enhanced Class Decompiler),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01JDBC以反射機(jī)制加載類(lèi)注冊(cè)驅(qū)動(dòng)連接MySQL
這篇文章介紹了JDBC以反射機(jī)制加載類(lèi)注冊(cè)驅(qū)動(dòng)連接MySQL的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01使用Spring Boot快速構(gòu)建基于SQLite數(shù)據(jù)源的應(yīng)用
為了提供一個(gè)單包易部署的服務(wù)器應(yīng)用,考慮使用Spring Boot,因?yàn)槠浼闪薃pache Tomcat,易于運(yùn)行,免去絕大部分了服務(wù)器配置的步驟2017-08-08Spring Boot整合RabbitMQ實(shí)例(Topic模式)
Topic Exchange 轉(zhuǎn)發(fā)消息主要是根據(jù)通配符。接下來(lái)通過(guò)本文給大家分享Spring Boot整合RabbitMQ實(shí)例(Topic模式),需要的朋友參考下吧2017-04-04關(guān)于ConditionalOnMissingBean失效問(wèn)題的追蹤
這篇文章主要介紹了關(guān)于ConditionalOnMissingBean失效問(wèn)題的追蹤方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03spring是如何實(shí)現(xiàn)聲明式事務(wù)的
這篇文章主要介紹了spring是如何實(shí)現(xiàn)聲明式事務(wù)的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Mybatis中的resultType和resultMap使用
這篇文章主要介紹了Mybatis中的resultType和resultMap使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-09-09