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

String、StringBuffer、StringBuilder 內存模型與常量池深度解析

     編輯:Java 綜合教學

String、StringBuffer、StringBuilder 內存模型與常量池深度解析

1. 三者核心定位

類可變性線程安全繼承關係
String不可變不可變即線程安全final class
StringBuffer可變同步方法,安全extends AbstractStringBuilder
StringBuilder可變非線程安全extends AbstractStringBuilder

2. String 不可變機制

public final class String {
    private final char value[];      // JDK 9+ 改為 byte[] + coder
    private int hash;                // hashCode 緩存,默認 0 表示未計算

    public String(String original) {
        this.value = Arrays.copyOf(original.value, original.value.length);
    }
}
  • final 類、final 數組引用、無修改方法 → 不可變。
  • 不可變帶來:線程安全、哈希緩存、常量池複用、安全性(網絡/文件路徑不可被篡改)。

3. 字符串常量池

  • 位置:JDK 7 移至堆中,受 GC 管理;JDK 6 在永久代。
  • 字面量自動入池:String s = "abc"; 編譯期進入常量池。
  • intern() 手動入池:new String("abc").intern() 運行期放入/獲取池中引用。
  • 好處:節省內存、== 可比較內容(僅限池內對象)。

4. StringBuffer/Builder 共同父類

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    char[] value;                    // 非 final,可擴容
    int count;                       // 有效字符數

    public AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }

    public AbstractStringBuilder append(String str) {
        ensureCapacity(count + str.length());
        str.getChars(0, str.length(), value, count);
        count += str.length();
        return this;
    }
}

StringBuffer 方法加 synchronized;StringBuilder 无同步。

5. 內存圖解

String s1 = "hello";           StringBuilder sb = new StringBuilder("hello");
常量池 "hello" ◄─────────────┐   堆對象 sb.value → ['h','e','l','l','o',0,0...]
                             │
String s2 = new String("hello");  堆對象 s2.value → ['h','e','l','l','o']
                     (不入池)

6. 性能基準建議

  • 單線程大量拼接:StringBuilder(預估容量 new StringBuilder(1024) 避免擴容)。
  • 多線程共享緩衝:StringBuffer 或 ThreadLocal。
  • 少量拼接/常量:直接 String,編譯器優化為 StringBuilder。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved