最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(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è)思路解答的評論 (共 條)

分享到微博請遵守國家法律
辽宁省| 略阳县| 旬阳县| 阿克苏市| 建水县| 长汀县| 肥城市| 丰都县| 延边| 梁河县| 盐边县| 恭城| 长春市| 贞丰县| 黄平县| 雷波县| 石嘴山市| 南宫市| 额济纳旗| 清远市| 疏附县| 北辰区| 永嘉县| 阿鲁科尔沁旗| 高清| 麻阳| 正宁县| 茌平县| 通渭县| 奎屯市| 宝应县| 汉川市| 工布江达县| 南平市| 来宾市| 阿瓦提县| 班戈县| 吉木乃县| 锡林郭勒盟| 浮山县| 辉南县|