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

StringBuffer/StringBuilder 高效字符串操作指南

     編輯:Java 程式設計入門

為什麼 String 會導致性能問題?

String 是不可變對象。每次拼接操作都會創建新對象:


String s = "Builder.com";
s += "is";        // 創建新對象 "Builder.comis"
s += "the place"; // 再創建新對象
s += "to be.";    // 又創建新對象
// 共創建 4 個 String 對象,3 個成為垃圾

大量拼接導致:內存分配頻繁、GC 壓力大、字符數組反復複製。

StringBuffer vs StringBuilder

核心構造方法


// 默認容量 16
StringBuffer sb1 = new StringBuffer();

// 指定初始容量,減少擴容次數
StringBuffer sb2 = new StringBuffer(100);

// 從字符串初始化,容量 = 長度 + 16
StringBuffer sb3 = new StringBuffer("Builder.com");

常用操作方法

追加內容


StringBuilder sb = new StringBuilder();
sb.append("B").append("u").append("i").append("l").append("d").append("er").append(".com");
// 鏈式調用,只創建一個對象
System.out.println(sb.toString());  // Builder.com

append 有 13 個重載,支持所有基本類型、對象、字符數組等。

容量管理


StringBuilder sb = new StringBuilder();
sb.ensureCapacity(100);  // 確保最小容量
System.out.println(sb.capacity());  // 當前分配容量
System.out.println(sb.length());    // 實際字符長度

sb.setLength(10);  // 截斷或填充空字符
sb.trimToSize();   // 釋放多餘容量(JDK 17+)

字符操作


StringBuilder sb = new StringBuilder("Hello World");

char c = sb.charAt(6);        // 'W'
sb.setCharAt(6, 'J');         // "Hello Jorld"

String sub = sb.substring(0, 5);  // "Hello" (不影響原對象)

sb.insert(6, "Java ");        // "Hello Java World"
sb.delete(5, 10);             // "HelloWorld"
sb.replace(0, 5, "Hi");       // "Hi World"

sb.reverse();                 // "dlroW olleH" - 反轉神器

數據輸出


// 獲取字符數組副本
char[] chars = new char[sb.length()];
sb.getChars(0, sb.length(), chars, 0);

// 寫入 Writer(高效輸出)
sb.appendTo(writer);  // JDK 17+,避免 toString() 創建中間字符串

性能對比實測


// 10萬次拼接測試
int N = 100_000;

long t1 = System.nanoTime();
String s = "";
for (int i = 0; i < N; i++) s += "a";
System.out.println("String: " + (System.nanoTime() - t1) / 1e6 + " ms");

long t2 = System.nanoTime();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) sb.append("a");
System.out.println("StringBuilder: " + (System.nanoTime() - t2) / 1e6 + " ms");

// 典型結果:
// String: ~15000 ms (O(N²))
// StringBuilder: ~5 ms (O(N))

最佳實踐總結

  1. 局部變量拼接首選 StringBuilder:非線程共享,性能最優
  2. 預估容量:new StringBuilder(estimatedSize) 減少擴容
  3. 避免在循環中使用 String +:編譯器優化有限,複雜循環無法優化
  4. 日誌/輸出場景:直接傳遞 StringBuilder 給 appendTo() 或 Writer
  5. 線程共享緩衝區:使用 StringBuffer 或 ThreadLocal

內部原理洞察

  • 底層維護 char[] value(JDK 9+ 為 byte[] + coder)
  • 擴容策略:newCapacity = (oldCapacity + 1) * 2
  • toString() 在 JDK 9+ 創建新 String 共享底層數組(無複製)

掌握 StringBuilder 正確用法,是 Java 開發者必備的基本功,能避免無數隱性性能陷阱。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性StringBufferStringBuilderString
線程安全同步方法,線程安全非同步,非線程安全不可變,天然線程安全
性能較低(同步開銷)最高(JDK 5+ 推薦)拼接性能最差
適用場景多線程環境單線程/局部變量(推薦)常量、少量拼接