| 類 | 可變性 | 線程安全 | 繼承關係 |
|---|---|---|---|
| String | 不可變 | 不可變即線程安全 | final class |
| StringBuffer | 可變 | 同步方法,安全 | extends AbstractStringBuilder |
| StringBuilder | 可變 | 非線程安全 | extends AbstractStringBuilder |
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 數組引用、無修改方法 → 不可變。String s = "abc"; 編譯期進入常量池。new String("abc").intern() 運行期放入/獲取池中引用。== 可比較內容(僅限池內對象)。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 无同步。
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']
(不入池)
StringBuilder(預估容量 new StringBuilder(1024) 避免擴容)。StringBuffer 或 ThreadLocal。String,編譯器優化為 StringBuilder。