五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

Java面試 | 代碼中創(chuàng)建了多少個(gè)字符串?換個(gè)思路解答

2023-07-21 23:05 作者:空擋滑行brz  | 我要投稿

關(guān)于String對象創(chuàng)建的問題經(jīng)常出現(xiàn)在Java的技術(shù)面試中,網(wǎng)上關(guān)于這個(gè)的原理解析已經(jīng)很多了,這篇文章提供一個(gè)用idea來驗(yàn)證的方法,不需要記住復(fù)雜的原理和源碼,好記好操作。”

基本原理

JVM會(huì)用一個(gè)字符串常量池來存儲(chǔ)字符串,這個(gè)一般開發(fā)人員都知道了,原因就是String使用的太頻繁了,重用肯定比創(chuàng)建新對象效率來的高。當(dāng)然能夠用常量池的基礎(chǔ)是String一個(gè)不可變對象,一旦創(chuàng)建完成,就不可修改了。Java中創(chuàng)建String對象的方法有好幾種,下面我們用idea來驗(yàn)證一下不同的寫法到底會(huì)創(chuàng)建幾個(gè)對象。

開始之前,先在idea中安裝一個(gè)jclasslib插件,后面會(huì)用到。這個(gè)插件可以可視化展示class文件內(nèi)容。


安裝idea插件

字符串對象創(chuàng)建

1. 代碼中直接寫字符串,比如String str =?"abc";?

這種方式。在idea中寫一個(gè)測試方法,并且加上斷點(diǎn)。Debug啟動(dòng)后,在Debug的Memory窗口就可以看到當(dāng)前堆中的對象統(tǒng)計(jì),Diff是指每次重新刷新后對象的數(shù)量變化。當(dāng)前第一次進(jìn)斷點(diǎn),所以Diff都是0。

創(chuàng)建對象前

點(diǎn)下一步,就可以看到,堆中新創(chuàng)建了1個(gè)String對象。那怎么確認(rèn)這個(gè)對象是否在堆的常量池中的呢?可以在下面再加一行:

定義str2未創(chuàng)建對象

可以看到String str2 = "abc";執(zhí)行完后,并沒有創(chuàng)建新的String對象。所以第一行創(chuàng)建的String是在常量池中。


2.?使用字符串創(chuàng)建新字符串,如String str =?new String("abc");

new創(chuàng)建字符串

可以發(fā)現(xiàn)新創(chuàng)建了2個(gè)String對象。一個(gè)肯定是常量池的,另外一個(gè)就是當(dāng)使用new String來創(chuàng)建字符串的時(shí)候,堆里還會(huì)有一個(gè)普通String對象。


3.?使用字符數(shù)組創(chuàng)建字符串, 如String str =?new String(char[]);

使用char[]創(chuàng)建字符串

同樣只創(chuàng)建了一個(gè)String,繼續(xù)驗(yàn)證是否放入常量池:

重新定義字符串

相對于第一行有2個(gè)對象創(chuàng)建,說明str2新創(chuàng)建了對象并放入了常量池。得出結(jié)論是使用字符數(shù)組創(chuàng)建String,不會(huì)放入常量池。


4.??多字符串連接,如String str = str0 + str1?+ str2;

連接后創(chuàng)建新對象

字符串連接后,新創(chuàng)建了一個(gè)對象。繼續(xù)驗(yàn)證一下是否在常量池:

連接后的字符串不在常量池

又新創(chuàng)建了一個(gè)String對象,說明字符串連接后也不會(huì)放入常量池。原因是什么呢?可以從編譯出的class文件找到答案。

idea的target目錄中找到編譯出的class文件,點(diǎn)擊“View->Show Bytecode With JclassLib”,如下圖:

字符串連接字節(jié)碼

可以看到編譯后的字符串連接其實(shí)使用StringBuilder實(shí)現(xiàn)的。那找到StringBuilder源代碼的toString()方法,發(fā)現(xiàn)最終使用的是new String(char[])這個(gè)構(gòu)造函數(shù)。所以最終的字符串不會(huì)進(jìn)入常量池。


總結(jié)

String原理是面試中經(jīng)常問道的問題,這篇文章用最簡單的方式驗(yàn)證,是否好記很多呢???

Java面試 | 代碼中創(chuàng)建了多少個(gè)字符串?換個(gè)思路解答的評論 (共 條)

分享到微博請遵守國家法律
太原市| 元阳县| 甘孜县| 庆城县| 泰和县| 隆安县| 罗城| 抚松县| 张家港市| 乡城县| 田东县| 南召县| 太仆寺旗| 千阳县| 仁寿县| 宜昌市| 昭觉县| 濮阳县| 天峻县| 阿勒泰市| 青川县| 新田县| 晋城| 咸丰县| 阳城县| 龙川县| 乌兰浩特市| 乳山市| 伊宁县| 安宁市| 新沂市| 扎兰屯市| 鲁甸县| 塔河县| 中超| 仙居县| 木里| 扬中市| 乌苏市| 泰兴市| 东乌珠穆沁旗|