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