java字符串常量池——字符串==比较的一个误区
轉(zhuǎn)自:https://blog.csdn.net/wxz980927155/article/details/81712342
?
起因
再一次js的json對象的比較中,發(fā)現(xiàn)相同內(nèi)容的json對象使用==比較并不相等。?
例如:
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux系统CPU相关信息查询
- 下一篇: 序(不知道是什么时候的模拟题)