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

Java String、StringBuffer、StringBuilder 三大字符串類核心差異與性能實測

     編輯:Java 程式設計入門

核心差異速查表

特性StringStringBufferStringBuilder
可變性不可變可變可變
線程安全不可變天然安全同步方法,安全非同步,不安全
性能頻繁修改極差中等(同步開銷)最高(無同步)
JDK 版本1.0+1.0+5.0+
繼承關係final classAbstractStringBuilder 子類AbstractStringBuilder 子類

String 不可變性性能陷阱


String s1 = "abc";
for (int i = 0; i < 10000; i++) {
    s1 += "def";  // 每次創建新 String、新 char[]、複製內容
    s1 = "abc";   // 重置,但 10000 個臨時對象已產生
}

循環結束後堆中殘留大量垃圾對象,觸發頻繁 GC,嚴重影響吞吐量。

編譯器優化陷阱:字面量拼接 vs 變量拼接


// 情況 1:字面量拼接 → 編譯期常量折疊
String s1 = "This is only a" + " simple" + " test";  
// 字節碼等價於:String s1 = "This is only a simple test"; // 極快

// 情況 2:變量拼接 → 運行時 StringBuilder
String s2 = "This is only a";
String s3 = " simple";
String s4 = " test";
String s5 = s2 + s3 + s4; 
// 字節碼:new StringBuilder().append(s2).append(s3).append(s4).toString() // 較慢

實測數據(10,000 次循環)

操作類型耗時 (ms)
String += 拼接4,392
StringBuffer.append()0
StringBuilder.append()0
變量引用拼接15
字面量直接拼接0

大數據量實測 (1,000,000 次)

類型耗時 (ms)
StringBuffer265
StringBuilder219

結論:StringBuilder 約快 15-20%,穩定優於 StringBuffer。

源碼級線程安全分析


// StringBuffer 核心方法
public synchronized int length() { return count; }
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}

// StringBuilder 核心方法(無 synchronized)
public int length() { return count; }
public StringBuilder append(String str) {
    super.append(str);
    return this;
}

兩者共享 AbstractStringBuilder 實現,差異僅在公共方法同步修飾符。

選擇決策指南

  1. 單線程 / 局部變量 / 高性能拼接 → StringBuilder(首選)
  2. 多線程共享緩衝區 → StringBuffer 或 ThreadLocal
  3. 常量拼接 / 少量操作 → String 直連(編譯器優化)
  4. 日誌框架佔位符 → 使用 log.debug("user={}", user) 避免不必要拼接

容量預分配優化


// 預估最終長度,避免多次擴容(默認 16,擴容 2倍+2)
StringBuilder sb = new StringBuilder(256); 
for (int i = 0; i < 100; i++) sb.append("item").append(i);

擴容涉及數組複製,預分配可顯著提升大量拼接性能。

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