[Java Performance] 字串拼接注意事項,performance拼接
字串拼接(String Concatenation)
// 編譯器最佳化前String answer = integerPart + "." + mantissa;// 編譯器最佳化後String answer = new StringBuilder(integerPart).append(".").append(mantissa).toString();
因為編譯器會對字串的拼接操作進行最佳化,所以在同一條語句中使用字串拼接操作對效能並沒有負面影響。正因為編譯器在幕後的最佳化,在任何情境下都使用StringBuilder替代“+”操作符來進行字串拼接是沒有必要的。
但是,當字串的拼接是由多條語句(或者迴圈)完成的,就有問題了:
// 編譯器最佳化前String answer = integerPart;answer += ".";answer += mantissa;// 編譯器最佳化後String answer = new StringBuilder(integerPart).toString();answer = new StringBuilder(answer).append(".").toString();answer = new StringBuilder(answer).append(mantissa).toString();
被編譯器最佳化的代碼中,中間的String對象以及StringBuilder對象實際上都是不需要的。此時,可以考慮將以上的拼接語句合并成一條拼接語句。或者直接顯式地使用StringBuilder對象。
總結
- 當字串拼接使用一條陳述式完成時,效能和使用StringBuilder時相當。
- 對於使用多條陳述式完成字串拼接時,考慮合并這些語句或者顯式使用StringBuilder。
java 怎提高字串拼接速度
使用StringBuffer,或者StringBuilder..都是可以改變是字串。
java字串拼接
不是指向同一個對象的。
假設再有個語句,String e = "test3";因為String是final的,不可修改,所以可以把e看成常量。
當再遇到String d="test"+"3"時,編譯器在這裡做了最佳化,把這條語句最佳化為String d="test3",由於存在一個相同的對象e,所以d也指向了e.
所以d、e是同一個對象。
而編譯器在處理String c=a+b時,認為是兩個變數相加,不會做最佳化。所以c,d不是同一個對象。
如果將a,b定義為
final String a = "test";
final String b="3";
這時String c=a+b就變成了常量相加,所以編譯器會對其進行最佳化,即這時c,d就相等了
ps:推薦樓主一本書《深入java虛擬機器》,對java的底層機制有很好的介紹。