前言
最近在突然想到了String字串拼接問題,于是做了一個demo測驗了一下,到底String型別的字串在拼接的時候,哪種情況下會走會走StringBulider進行字串拼接,而哪種情況編譯器會對代碼進行優化?話不多說,先看demo
一.問題
案例1

可以發現,str == str2的結果為false,那么我們在看看下一個例子,
案例2

這時候,兩個字串對比的結果為true,
二.探究問題
這時候,疑問就來了,為什么結果會不一致呢?利用在cmd視窗輸入javap -c TestDemo.class命令,對位元組碼檔案進行反編譯,發現了問題所在?

可以看到在案例1中,java代碼底層走了StringBuilder,進行字串拼接,然后呼叫了StringBuilder的toString方法,

而案例2中,對class檔案進行反編譯,發現代碼出現了一點變化,并沒有走StringBuilder進行字串拼接,
三.總結
- 案例1中,通過變數和字串拼接,java是需要先到記憶體找變數對應的值,才能進行完成字串拼接的作業,這種方式java編譯器沒法優化,只能走
StringBuilder進行拼接字串,然后呼叫toString方法,當然回傳的結果和常量池中的111這個字串的記憶體地址是不一樣的,因此結果為false, - 案例2中,直接在運算式里寫值,java不用根據變數去記憶體里找對應的值,可以在編譯的時候直接對這個運算式進行優化,優化后的運算式從
"111" + ""直接變成了"111",兩個String型別的變數都指向了常量池的111字串,因此結果為true;
作者:叫我不矜持
鏈接:https://www.jianshu.com/p/a80c9b2b89cd
近期熱文推薦:
1.Java 15 正式發布, 14 個新特性,重繪你的認知!!
2.終于靠開源專案弄到 IntelliJ IDEA 激活碼了,真香!
3.我用 Java 8 寫了一段邏輯,同事直呼看不懂,你試試看,,
4.吊打 Tomcat ,Undertow 性能很炸!!
5.《Java開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/231284.html
標籤:Java
上一篇:萌新求助,資料約定是什么意思??
下一篇:多執行緒與高并發常見面試題(1)
