首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 字串串接效能深度解析:+、concat、StringBuffer、StringBuilder 大比拚

     編輯:Java 相關知識

字串操作是 Java 開發中最基礎也最常見的任務。但在迴圈中大量串接字串時,不同寫法的效能差異極大。本文透過實測與位元碼分析,深入比較四種串接方式:+ 運算子、String.concat()、StringBuffer.append()、StringBuilder.append(),揭示效能差異背後的原理。

測試環境與方法

  • 迴圈結構:外層 20 次,內層 50,000 次串接 "*"
  • 測試工具:Perf4J 統計最小/最大/平均耗時、標準差
  • 環境:64-bit Windows 7、32-bit JVM (7-ea)、4GB RAM、雙核 2.00GHz

四種串接方式的程式碼骨架

// 1. + 運算子
String addTestStr = "";
for (int i = 0; i <= INNER_ITERATION; i++) {
    addTestStr += "*";
}

// 2. String.concat()
String concatTestStr = "";
for (int i = 0; i <= INNER_ITERATION; i++) {
    concatTestStr = concatTestStr.concat("*"); // 注意:必須接收回傳值
}

// 3. StringBuffer
StringBuffer sb = new StringBuffer();
for (int i = 0; i <= INNER_ITERATION; i++) {
    sb.append("*");
}

// 4. StringBuilder
StringBuilder sbu = new StringBuilder();
for (int i = 0; i <= INNER_ITERATION; i++) {
    sbu.append("*");
}

實測結果概覽

方式平均耗時 (ms)相對效能
StringBuilder~1.8最快(基準)
StringBuffer~3.3約 1.8 倍慢(同步化開銷)
String.concat()~1650極慢(每次建立新 StringBuilder + toString)
+ 運算子最慢每次迴圈隱建 StringBuilder,產生大量暫存物件

位元碼層面的真相

反編譯 String.concat() 可見其內部實作:

new StringBuilder()
    .append(this)      // 原字串
    .append(str)       // 參數字串
    .toString()        // 轉回 String

每次呼叫 concat() 都會:

  1. 建立新的 StringBuilder 實例
  2. 執行兩次 append
  3. 呼叫 toString() 產生新 String

在迴圈中這意味著產生大量短命物件,導致 GC 壓力劇增,效能遠遜於直接複用單一 StringBuilder。

關鍵結論與最佳實踐

  • 單次或少量串接:使用 + 或 concat() 皆可,編譯器會優化,可讀性優先。
  • 迴圈/大量串接:務必使用 StringBuilder(單執行緒)或 StringBuffer(多執行緒共享)。
  • 避免在迴圈中使用 + 或 concat():會產生 O(n²) 的物件建立與複製開銷。
  • 預估容量:可用 new StringBuilder(預估長度) 減少擴容複製。

補充說明:原文測試程式碼中 concatTestStr.concat("*") 未接收回傳值,實際測試應修正為 concatTestStr = concatTestStr.concat("*"),修正後 concat() 平均耗時約 1650 ms,印證上述分析。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved