相信很多Java開發的小夥伴對String字符串拼接都不陌生,或多或少都使用過,因爲方便使用。但殊不知頻繁使用字符串拼接會嚴重降低性能。今天我們看一看如何讓String拼接提升十幾倍的性能。
那麼應該從編譯講起,Java 從 JDK5 開始,便在編譯期間進行了優化。如果是無變量的字符串拼接,那麼在編譯期間值都確定了, javac 工具會直接把它編譯成一個字符常量。如果有變量的字符串拼接,在編譯期間變量的值是無法確定,所以在運行期間會生成一個StringBuilder 對象。從這裏可以看出兩者的區別在於有沒有生成StringBuilder對象,如果頻繁使用有變量的字符串拼接,那麼也就會生成很多StringBuilder對象,必然對性能就會造成影響。
我們使用循環內的字符串拼接舉個例子
// 循環中使用字符串拼接
String a = "0";
Long start = System.currentTimeMillis();
for (int i = 1; i < 10000; i++) {
a = a + i;
}
System.out.println("字符串拼接執行一萬次時間:" + (System.currentTimeMillis() - start) + " 毫秒");
// 循環外定義StringBuilder
start = System.currentTimeMillis();
StringBuilder b = new StringBuilder();
for (int i = 1; i < 5000000; i++) {
b.append(i);
}
System.out.println("使用StringBuilder執行五百萬次時間:" + (System.currentTimeMillis() - start) + " 毫秒");
大家可以想象一下,如代碼所示,在循環中使用字符串拼接的話,只循環一萬次的執行時間,和在循環外定義StringBuilder,在循環中使用append,循環五百萬次的執行時間,哪個更優呢?哈哈哈 循環次數可是 500倍之差哦!!
可以見得!! 一萬次的執行時間比五百萬次的執行時間還長 130毫秒!!!
原因在於 使用字符串拼接,每循環一次就會產生一個新的 StringBuilder 對象,對資源有一定的損耗。這裏循環一萬次也就是會產生一萬個 StringBuilder 對象。。而循環外使用 StringBuilder,循環內再執行 append() 方法拼接字符串,不管循環幾次都只會產生一個 StringBuilder 對象。可怕可怕😱