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

2. 編譯成class文件 javac Test.java
3.javap反編譯 javap -c Test.class
得到結(jié)果如下:

下面我們分析下:
第一種方式 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的話,只需要在外面初始化一次就可以了。
