String.valueOf(1) 和 1+"" 的區(qū)別

今天修改項(xiàng)目中之前別人的代碼,前人使用Int或者long轉(zhuǎn)換成String都用的String.valueOf,我自己習(xí)慣拼接個(gè)空字符串。改完之后我就有個(gè)疑問,這兩個(gè)有什么區(qū)別?哪個(gè)性能好點(diǎn)之類的?既然有疑問,那就行動(dòng)證明下。

首先想到的是反編譯:

1. 寫個(gè)簡(jiǎn)單的測(cè)試類,如下:
image.png
2. 編譯成class文件 javac Test.java
3.javap反編譯 javap -c Test.class

得到結(jié)果如下:


image.png

下面我們分析下:

第一種方式 1 + “” :當(dāng)執(zhí)行這種操作的時(shí)候,因?yàn)?和""("xyz"等字符串一樣)都是常量,作用編譯器自動(dòng)幫我們優(yōu)化成拼接后的字符串常量,我們上面的就是String類型的1。

第二種方式String.valueOf():調(diào)用了String的靜態(tài)方法valueOf。因?yàn)檎{(diào)用方法的指令操作,所有相當(dāng)于第一種方式效率肯定會(huì)差點(diǎn)。對(duì)于現(xiàn)代計(jì)算機(jī)的能力來說,量到達(dá)一定大的時(shí)候,才會(huì)有點(diǎn)效果吧。普通使用幾乎可以忽略吧。

第三種方式:先定義一個(gè)字符串,然后執(zhí)行”+“的操作。通過反編譯可以看到,虛擬機(jī)幫我們調(diào)用了StringBuilder的apped(),最后調(diào)用了toString()的方法。這種也沒有什么好說的。但是有個(gè)使用技巧:在循環(huán)中(特別量比較大的),推薦自己使用StringBuilder,而不是通過“+”的方式拼接字符串。原因就是如果用“+”的方式,每次的循環(huán)中,虛擬機(jī)都會(huì)初始化StringBuilder一次,如果我們自己使用StringBuilder的話,只需要在外面初始化一次就可以了。


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容