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