日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java字符串常量池——字符串==比较的一个误区

發(fā)布時(shí)間:2025/3/8 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java字符串常量池——字符串==比较的一个误区 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)自:https://blog.csdn.net/wxz980927155/article/details/81712342

?

起因

再一次js的json對象的比較中,發(fā)現(xiàn)相同內(nèi)容的json對象使用==比較并不相等。?
例如:

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

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

但最令我不解的是為什么js的字符串比較可以用==來比較字符串的內(nèi)容是否相等,而java卻要使用equals去比較字符串的內(nèi)容是否相等。但當(dāng)我發(fā)現(xiàn)下面代碼的時(shí)候又刷新了我這個(gè)菜鳥的認(rèn)知。

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

?

結(jié)果難道不該為false嗎?字符串的比較難道不是用equals來比較內(nèi)容是否相等嗎?兩個(gè)不同的對象創(chuàng)建的內(nèi)存地址應(yīng)該是不一樣的啊!!后來經(jīng)過網(wǎng)上查閱資料發(fā)現(xiàn)jvm還存在一個(gè)字符串常量池。


字符串常量池

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

在我的理解中常量池應(yīng)該是為了減少開發(fā)者對字符串過度的創(chuàng)建,導(dǎo)致內(nèi)存使用率的提升,畢竟String類是一個(gè)final類,操作字符串永遠(yuǎn)不會(huì)改變當(dāng)前字符串的值,只會(huì)新增一個(gè)字符串對象。

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

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

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

new String()會(huì)在代碼運(yùn)行的時(shí)候在堆中開辟一個(gè)空間存放引用字符串常量池里面的地址但是棧里面引用的堆的地址是不一樣的,所以即使引用的字符串常量池里面的地址是一樣也永遠(yuǎn)不可能為true!!?


intern方法

強(qiáng)制String對象使用字符串常量池

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

?

經(jīng)典面試題

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

總結(jié)

  • 字符串字面量會(huì)在編譯的就開始判斷是否在字符串常量池里面創(chuàng)建,而new String()會(huì)在代碼運(yùn)行的時(shí)候才去判斷。

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

  • 轉(zhuǎn)載于:https://www.cnblogs.com/maohuidong/p/10074674.html

    總結(jié)

    以上是生活随笔為你收集整理的java字符串常量池——字符串==比较的一个误区的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。