String字符串拼接優(yōu)化
在之前的筆記String藻肄、StringBuffer蔑舞、StringBuilder三兄弟中,提到
String被聲明為final class嘹屯,即String類型不可變攻询,正因為他的不可變性,當我們拼接字符串時會產生很多無效的中間對象州弟,頻繁的使用String字符串做拼接钧栖,會產生大量的垃圾對象,影響系統(tǒng)的性能婆翔。
我們知道可以用StringBuilder拯杠、StringBuffer的append方法來代替普通的"+"方式,但如果代碼直接使用的"+",那Java編譯器真的會傻傻的采用"+"方式么啃奴?寫個Demo潭陪,看看編譯器有沒有什么"小動作":
public class TestString {
public static void main(String[] args) throws Exception {
String str1 = "abc";
String str2 = "d";
String str3 = "e";
String str4 = "f";
System.out.println(str1 + str2 + str3 + str4);
}
}
通過javap -c TestString.class
命令進行反編譯(忽略我這不知道咋地就過期的windows...)(注:jdk1.5以前,應該是通過StringBuffer進行優(yōu)化的最蕾,因為那時候StringBuilder還沒出生...沒有找到老版本jdk所以沒有進行測試依溯,有環(huán)境的兄嘚可以試一下):
通過反編譯的內容,我們看到編譯器創(chuàng)建了StringBuilder對象瘟则,通過append方式代替了“+”的方式黎炉,說明編譯器在編譯過程中“偷偷”對代碼進行了優(yōu)化。
循環(huán)拼接下的優(yōu)化
public class TestString {
public static void main(String[] args) throws Exception {
String str1 = "abc";
for (int i = 0; i < 4; i++) {
str1 += i;
}
System.out.println(str1);
}
}
通過查看反編譯的class文件醋拧,編譯器在for循環(huán)內部每次都新創(chuàng)建了StringBuilder拜隧,然后再去append拼接,這本身就是浪費資源了趁仙,所以不能夠太依賴編譯器洪添。
總結
通過上面的案例,我們得知編譯器對字符串以"+"的拼接方式進行了優(yōu)化雀费,但不能太依賴編譯器干奢,在某些情況下(如循環(huán)拼接),編譯器的優(yōu)化可能并不好盏袄。所以應該養(yǎng)成良好的開發(fā)習慣忿峻,減少字符串"+"拼接的使用。