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

Java 字符串構建器 StringBuilder 源碼深度剖析:擴容、插入、刪除、翻轉全解析

     編輯:Java 綜合教學

為什麼選 StringBuilder?

頻繁字符串修改場景下,String 不可變導致大量對象創建。StringBuilder(非線程安全、高性能)與 StringBuffer(線程安全、有鎖開銷)API 幾乎一致,單線程首選 StringBuilder。

核心字段

char[] value;   // 底層字符數組,非 final,可修改
int count;      // 實際使用字符數

構造與初始容量

public StringBuilder() { super(16); }  // 默認 16 字符
public StringBuilder(int capacity) { super(capacity); }
public StringBuilder(String str) { super(str.length() + 16); append(str); }

append 核心邏輯

public AbstractStringBuilder append(String str) {
    if (str == null) str = "null";
    int len = str.length();
    ensureCapacityInternal(count + len);  // 確保容量
    str.getChars(0, len, value, count);   // 複制字符
    count += len;
    return this;
}

擴容策略:指數增長

int newCapacity = value.length * 2 + 2;
if (newCapacity - minimumCapacity < 0) newCapacity = minimumCapacity;
value = Arrays.copyOf(value, newCapacity);
  • 默認 16 → 34 → 70 → 142… 指數級增長
  • 平衡「減少分配次數」與「避免空間浪費」
  • 預知大概長度可用 new StringBuilder(estimatedSize) 避免多次擴容

toString 實現:防禦性複製

public String toString() {
    return new String(value, 0, count);  // 新建 String,不共享數組,保證不可變性
}

關鍵修改操作源碼解析

insert:數組右移 + 複制

System.arraycopy(value, offset, value, offset + len, count - offset);  // 向後挪動
str.getChars(value, offset);  // 填入新字符
count += len;

System.arraycopy 為 native 方法(C++ 實現),支援同數組源目重疊複製,效率極高。

delete:數組左移覆蓋

System.arraycopy(value, start + len, value, start, count - end);
count -= len;

replace:刪除區間 + 插入新串

delete(start, end);
insert(start, str);

reverse:增補字符安全翻轉

非簡單 char[] 反轉,對補充字符(> 0xFFFF)雙 char 做二次修正,保證字符有效性。

append 重載家族

支援 boolean, char, int, long, float, double, Object, CharSequence, char[] 等所有基本類型與常見對象,內部統一轉字符後調用核心 append(String)。

總結

  • 底層 char[] + count 設計,變長數組思想
  • 指數擴容策略,Arrays.copyOf 實現
  • 核心操作均依賴 System.arraycopy 高效移動數據
  • toString() 防禦性複製保證 String 不可變
  • 非線程安全,多線程環境用 StringBuffer 或 ThreadLocal 隔離
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved