java字符串常量池——字符串==比較的一個誤區

轉自:https://blog.csdn.net/wxz980927155/article/details/81712342

?

起因

再一次js的json對象的比較中,發現相同內容的json對象使用==比較并不相等。?
例如:

var obj = {};
var obj2 = {};
console.log(obj == obj2); // 結果為false

json在js中代表一個對象==比較的是對象棧中存放引用堆的地址。上面的obj和obj2創建的是兩個對象地址肯定不同結果為false。

但最令我不解的是為什么js的字符串比較可以用==來比較字符串的內容是否相等,而java卻要使用equals去比較字符串的內容是否相等。但當我發現下面代碼的時候又刷新了我這個菜鳥的認知。

String str1 = "test";
String str2 = "test";
System.out.println(str1 == str2); // 結果為true 

?

結果難道不該為false嗎?字符串的比較難道不是用equals來比較內容是否相等嗎?兩個不同的對象創建的內存地址應該是不一樣的啊!!后來經過網上查閱資料發現jvm還存在一個字符串常量池。


字符串常量池

讓我們先分析一下上述的代碼:

在我的理解中常量池應該是為了減少開發者對字符串過度的創建,導致內存使用率的提升,畢竟String類是一個final類,操作字符串永遠不會改變當前字符串的值,只會新增一個字符串對象。

String str1 = "test";
/* jvm在編譯的時候會先查看str1字面量test是否存放在字符串常量池中有則直
接引用字符串常量池里面的地址,沒有則在字符串常量池新創建一個*/
String str2 = "test"; /* str2發現字符串常量池里面已經有了test則直接把字符串常量池里面的地址拿 了過來*/ System.out.println(str1 == str2); // 最終str1和str2的地址都是相同的結果肯定為true啦

既然都到這里在拓展拓展在走唄

String str1 = new String("test");
String str2 = new String("test"); System.out.println(str1 == str2); // 結果為false // 這個為什么不為true了呢?

new String()會在代碼運行的時候在堆中開辟一個空間存放引用字符串常量池里面的地址但是棧里面引用的堆的地址是不一樣的,所以即使引用的字符串常量池里面的地址是一樣也永遠不可能為true!!?
大概是這個樣子


intern方法

強制String對象使用字符串常量池

String str1 = new String("test");
String str2 = new String("test"); str1 = str1.intern(); str2 = str2.intern(); System.out.println(str1 == str2); // 結果為true 

?

經典面試題

String str1 = new String("test");
// 此代碼執行會創建幾個對象? // A:1個或2個,堆中會創建一個,字符串常量池中有test則常量池中不會創建,沒有則創建

總結

  1. 字符串字面量會在編譯的就開始判斷是否在字符串常量池里面創建,而new String()會在代碼運行的時候才去判斷。

  2. 字符串常量池里面沒有此字符串則會創建,有則會去引用字符串常量池里面的字符串。字面量里字符串常量池的地址存放在棧中,new String()則存放在堆中。

轉載于:https://www.cnblogs.com/maohuidong/p/10074674.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537356.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537356.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537356.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java注解_Java注解教程及自定義注解

Java注解提供了關于代碼的一些信息,但并不直接作用于它所注解的代碼內容。在這個教程當中,我們將學習Java的注解,如何定制注解,注解的使用以及如何通過反射解析注解。Java1.5引入了注解,當前許多java框架中大量使用注解…

Git設置忽略eclipse配置文件

概述 eclipse的配置文件是不能公用的,不同電腦上的eclipse配置文件內容是不一樣的,如果將eclipse配置文件上傳到了git,其他開發下載后,導入項目,有些報錯就是因為配置文件關系 操作 在git的忽略文件“.gitignore”里…

MySQL 時間函數

A. timestampdiff() 傳三個參數,第一個時間類型如年,月,日,第二個開始時間,第三個結束時間select test_name, timestampdiff(YEAR,create_time,end_time) y_date from test_table; --計算時間 -------------------| te…

jdk安裝包_第一章(第1節):安裝JDK

對于 jdk 的安裝,網上有很多種圖文解說,但是老鳥發現它們大都不嚴謹,非常不適合小白。本節課,老鳥就給大家做個小白教程,無論你多么菜,你一定可以安裝上,否則你加我微信,我給你打五毛…

eclipse 國內鏡像高速下載

概述 eclipse是優秀的老牌IDE,使用eclipse是一種身份的象征,代表了老程序員。eclipse每年都會更新,也越來越好用。但下載的時候,速度一直有點慢,eclipse官網提供了國內鏡像,下載很快。 操作步驟 第一步&…

matlab圖像去毛刺_警微圈 圖像處理第三講CLAHE

警微圈圖像處理100講 第三講《限制對比度自適應直方圖均衡化》- 圈語 -為給圈粉們提供一些結合公安工作的實用圖像處理方法,小編為大家準備了一些程序處理算法(附帶代碼)。小編使用的圖像處理軟件是matlab(該軟件關注警微圈后臺回復“matlab”即可獲得下載資源)&…

Java 使用 POI 操作 Excel

Apache POI 基本介紹 Apache POI 是 Apache 軟件基金會提供的 100% 開源庫。支持 Excel 庫的所有基本功能。 圖片來源:易百教程 基本概念 在 POI 中,Workbook代表著一個 Excel 文件(工作簿),Sheet代表著 Workbook 中的…

Microsoft Project 變更項目日歷的注意事項

場景 今天在修改一份mpp排期計劃里的項目日歷,日歷是設置了周末2天加班,變更后發現,排期縮短的天數不對。一開始以為是Project軟件出問題了,與windows11不兼容,重啟了電腦,重試后還是這樣,后來…

python共享單車案例分析_python分析數據分析項目:共享單車租用情況影響因素探索分析...

python分析數據分析項目:共享單車租用情況影響因素探索分析

第十九節TypeScript 模塊

1、TypeScript模塊: 模塊是在其自身的作用域里執行,并不是在全局作用域,這意味著定義在模塊里面的變量、函數和類等在模塊外部是不可見的,除非明確地使用 export 導出它們。類似地,我們必須通過 import 導入其他模塊導…

微軟宣布 Edge 瀏覽器將切換至 Chromium 內核

簡述 據微軟官方 blog的消息,windows 的默認瀏覽器 Edge將切換內核至 Chromium,并且微軟將秉承開源精神,在未來更多的為 Chromium項目貢獻代碼。 微軟具體說了什么? 原文如下: For the past few years, Microsoft has …

解決the resource is not on the build path of a java project

場景 普通的Java project 轉maven 項目后,導入類提示:the resource is not on the build path of a java project 解決方法 將檢查java build source,將報錯的刪除,重新添加src資源包

python實現按回車鍵繼續程序_python實現按任意鍵繼續執行程序

在windows下寫bat的時候,通過pause命令,可以暫停程序運行,例如經常見的程序會在終端提示”按任意鍵繼續……”,用戶在終端回車后程序可以接著運行,這個功能有多大用途今天暫且不說,但我覺得應該有很多人也想在python下…

Beta

目錄 過去存在的問題任務分工規范后端總結卉卉家燦前端總結緒佩青元愷琳宇恒丹丹算法&API接口家偉鴻杰一好文檔&博客撰寫政演產品功能我們已經坐了哪些調整桌面控件合并我們會在Beta沖刺中做哪些改進組長博客:https://www.cnblogs.com/heihuifei/p/10084535…

項目驗收文檔合并技巧

1)先將各個文件word寫好,格式,字體調整好; 2)每個word導出PDF; 3)將導出的PDF合并到一個大的PDF;

xsl判斷節點存在_HashMap1.8之節點刪除分析

HashMap之節點刪除大家一直關注的都是HashMap如何添加節點,當節點數量大于8的時候轉化為紅黑樹,否則使用鏈表等等,但大家是否有看過刪除節點的處理邏輯呢? 今天來看看HashMap刪除節點的神來之筆問題來源在查看HashMap源碼時&#…

用Emit技術替代反射

System.Reflection.Emit命名空間類可用于動態發出Microsoft中間語言(MSIL)代碼,以便生成的代碼可以直接執行。反射也用于獲取有關類及其成員的信息。換句話說,反射是一種技術,允許您檢查描述類型及其成員的元數據&…

windows安裝TortoiseGit詳細使用教程

windows安裝TortoiseGit詳細使用教程【基礎篇】_小飛牛的技術博客_51CTO博客windows安裝TortoiseGit詳細使用教程【基礎篇】,環境:win8.164bit安裝準備:首先你得安裝windows下的git msysgit1.9.5安裝版本控制器客戶端tortoisegit tortoisegit…

keras中文文檔_【DL項目實戰02】圖像識別分類——Keras框架+卷積神經網絡CNN(使用VGGNet)

版權聲明:小博主水平有限,希望大家多多指導。目錄:【使用傳統DNN】BG大龍:【DL項目實戰02】圖像分類——Keras框架使用傳統神經網絡DNN?zhuanlan.zhihu.com【使用卷積神經網絡CNN】BG大龍:【DL項目實戰02】圖像識別分…

Java Html轉pdf實戰

Java Html轉pdf實戰 - 簡書年尾手頭沒啥事,干起了打雜工作,最近幫忙解決后端項目里一個html批量轉pdf速度慢的問題,項目里用到的轉換工具是 wkhtmltopdf ,這貨轉單個html還好,批量轉速...https://www.jianshu.com/p/d0…