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

Java API 核心:String 與 StringBuffer/StringBuilder 深度對比與性能實戰

     編輯:Java 綜合教學

核心區別一覽

特性StringStringBufferStringBuilder
可變性不可變可變可變
線程安全天然安全同步方法,安全非同步,不安全
性能拼接產生新對象鎖開銷,單線程較慢無鎖,單線程最快
適用場景常量、鍵、少量拼接多線程共享緩衝區單線程大量拼接、構建器
繼承關系final classextends AbstractStringBuilderextends AbstractStringBuilder

String 不可變性原理與影響

String s = "ab";
s = s + "cd"; // 實際:new StringBuilder().append("ab").append("cd").toString()
// 產生 3 個對象:"ab"、"cd"、新 StringBuilder、結果 String
// 原 "ab" 變垃圾,等待 GC

字符串常量池:字面量 "abc" 存放在常量池,new String("abc") 強制創建堆對象。intern() 可手動入池。

equals vs == 經典陷阱

String a1 = new String("abc");
String a2 = new String("abc");
String a3 = "abc";
String a4 = "abc";

a1.equals(a2); // true - 內容比較
a1 == a2;      // false - 引用比較,不同堆對象
a3 == a4;      // true - 常量池同一引用
a1 == a3;      // false - 堆 vs 常量池
  • ==:比較引用地址(基本類型比值)
  • equals():比較內容(Object 默認比引用,String 重寫比內容)
  • 自定義類必須重寫 equals/hashCode 才能語義化比較

StringBuilder 實戰性能測試

public class ConcatBenchmark {
    static final int N = 100_000;
    
    public static void main(String[] args) {
        // String +=
        long t1 = System.nanoTime();
        String s = "";
        for (int i = 0; i < N; i++) s += "x";
        long t2 = System.nanoTime();
        
        // StringBuilder
        long t3 = System.nanoTime();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < N; i++) sb.append('x');
        String r = sb.toString();
        long t4 = System.nanoTime();
        
        System.out.printf("String += : %.2f ms%n", (t2-t1)/1e6);
        System.out.printf("StringBuilder: %.2f ms%n", (t4-t3)/1e6);
        // 典型輸出:String += 12000 ms, StringBuilder 2 ms
    }
}

常用方法速查

操作StringStringBuilder/Buffer
長度length()length()
字符訪問charAt(i)charAt(i)
子串substring(begin, end)substring(begin, end)
查找indexOf(str), lastIndexOf, containsindexOf(str)
替換replace(old, new), replaceAll(regex, repl)replace(start, end, str)
分割split(regex)—
大小寫toUpperCase(), toLowerCase()—
去空白trim(), strip() (Java 11)—
格式化String.format(), String.join()append() 鏈式
轉數組toCharArray(), getBytes()toString() → 再轉
容量管理—capacity(), ensureCapacity(), trimToSize()

String.join / StringJoiner (Java 8+)


最佳實踐總結

  1. 單線程拼接循環:StringBuilder(預估容量 new StringBuilder(1024) 避免擴容)
  2. 多線程共享緩衝:StringBuffer 或 ThreadLocal<StringBuilder>
  3. 常量/鍵/少量拼接:直接用 String,編譯器優化常量折疊
  4. 格式化:String.format、MessageFormat、StringJoiner
  5. 比較內容:永遠用 equals(),Objects.equals(a,b) 防空指針
  6. 避免在循環中 +=:O(n²) 災難,代碼審查必查項

理解 String 不可變設計與 StringBuilder 可變緩衝機制,是寫出高性能、低 GC 壓力 Java 代碼的基本功。

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