String mango = "mango";
String s = "abc"+mango+"def"+47;
s += "cdf0";
s += "cdf1";
System.out.println(s);
可以使用javac進(jìn)行編譯,然后用javap -c反編譯扇调。
QQ截圖20170226010437.png
經(jīng)過這樣操作可以發(fā)現(xiàn):
編譯器使用了StringBuilder對象矿咕,用于連接字符串。
對于+
操作符狼钮,本質(zhì)上是使用StringBuilder的append方法碳柱。
String s = "abc"+mango+"def"+47;
這段代碼,只創(chuàng)建了一個StringBuilder
對象熬芜,用append方法完成了字符串連接莲镣。
s += "cdf0";
s += "cdf1";
上面兩個表達(dá)式創(chuàng)建了兩個StringBuilder
對象,因此可以知道涎拉,每重載一個+=
操作符瑞侮,就會創(chuàng)建一個StringBuilder
對象的圆。創(chuàng)建對象就會產(chǎn)生開銷半火。
上面代碼創(chuàng)建了三個StringBuilder
對象。
所以應(yīng)當(dāng)減少這兩個操作符的重載梅掠,可以對性能產(chǎn)生微小的提升藐鹤。
作為對比應(yīng)該有明確使用StringBuilder
對象進(jìn)行的字符串連接。
StringBuilder result = new StringBuilder();
String mango = "mango";
result.append("abc");
result.append(mango);
result.append("def");
result.append(47);
result.append("cdf0");
result.append("cdf1");
System.out.println(result.toString());
以上代碼完成了同樣的字符串連接挠蛉。
反編譯結(jié)果如下:
QQ截圖20170226011553.png
明顯只創(chuàng)建了一個StringBuilder
對象谴古。