- 可變性
簡單的來說:String 類中使用 final 關(guān)鍵字字符數(shù)組保存字符串拔稳,private final char value[],所以 String對象是不可變的锹雏。而StringBuilder 與 StringBuffer 都繼承自 AbstractStringBuilder 類巴比,在 AbstractStringBuilder中也是使用字符數(shù)組保存字符串char[]value 但是沒有用 final 關(guān)鍵字修飾,所以這兩種對象都是可變的礁遵。
StringBuilder 與 StringBuffer 的構(gòu)造方法都是調(diào)用父類構(gòu)造方法也就是 AbstractStringBuilder 實(shí)現(xiàn)的匿辩,大家可以自行查閱源碼。
AbstractStringBuilder.java
abstract class AbstractStringBuilder implements Appendable, CharSequence {
char[] value;
int count;
AbstractStringBuilder() {
}
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
- 線程安全性
String 中的對象是不可變的榛丢,也就可以理解為常量,線程安全挺庞。AbstractStringBuilder 是 StringBuilder 與StringBuffer 的公共父類晰赞,定義了一些字符串的基本操作,如 expandCapacity、append掖鱼、insert然走、indexOf 等公共方法。StringBuffer 對方法加了同步鎖或者對調(diào)用的方法加了同步鎖戏挡,所以是線程安全的芍瑞。StringBuilder 并沒有對方法進(jìn)行加同步鎖,所以是非線程安全的褐墅。 - 性能
每次對 String 類型進(jìn)行改變的時(shí)候拆檬,都會生成一個(gè)新的 String 對象,然后將指針指向新的 String 對象妥凳。StringBuffer 每次都會對 StringBuffer 對象本身進(jìn)行操作竟贯,而不是生成新的對象并改變對象引用。相同情況下使用StirngBuilder 相比使用 StringBuffer 僅能獲得 10%~15% 左右的性能提升逝钥,但卻要冒多線程不安全的風(fēng)險(xiǎn)屑那。 - 對于三者使用的總結(jié):
- 操作少量的數(shù)據(jù) = String
- 單線程操作字符串緩沖區(qū)下操作大量數(shù)據(jù) = StringBuilder
- 多線程操作字符串緩沖區(qū)下操作大量數(shù)據(jù) = StringBuffer