可變性
String 類中使用 ?nal 關鍵字字符數組保存字符串, private final char value[] ,所以 String 對象是不可變的。
StringBuilder 與 StringBu?er 都繼承自 AbstractStringBuilder 類,在 AbstractStringBuilder 中也是使用字符數組保存字符串 char[]value 但是沒有用 ?nal 關鍵字修飾,所以這兩種對象都是可變的。
StringBuilder 與 StringBu?er 的構造方法都是調用父類構造方法也就是 AbstractStringBuilder 實現的
?
String 類
private final char value[];
?
StringBuilder 與 StringBu?er 都繼承自 AbstractStringBuilder 類
?
在 AbstractStringBuilder 中也是使用字符數組保存字符串 char[]value ,但是沒有用 ?nal 關鍵字修飾,所以StringBuilder 與 StringBu?er 這兩種對象都是可變的
?
?
線程安全性
String 中的對象是不可變的,也就可以理解為常量,線程安全。AbstractStringBuilder 是 StringBuilder 與 StringBu?er 的公共父類,定義了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共 方法。StringBu?er 對方法加了同步鎖或者對調用的方法加了同步鎖,所以是線程安全的。StringBuilder 并沒有對 方法進行加同步鎖,所以是非線程安全的。
性能
每次對 String 類型進行改變的時候,都會生成一個新的 String 對象,然后將指針指向新的 String 對象。
StringBu?er 每次都會對 StringBu?er 對象本身進行操作,而不是生成新的對象并改變對象引用。相同情況下使用 StirngBuilder 相比使用 StringBu?er 僅能獲得 10%~15% 左右的性能提升,但卻要冒多線程不安全的風險。
對于三者使用的總結:
- 操作少量的數據 = String
- 單線程操作字符串緩沖區下操作大量數據 = StringBuilder
- 多線程操作字符串緩沖區下操作大量數據 = StringBu?er
?
StringBu?er加了鎖synchronized
?