String 和 StringBuffer、StringBuilder 的區別是什麼?String 爲什 麼是不可變的?

 可變性java

簡單來講:String類中使用final關鍵字字符數組保存字符串 private final char value[] 因此String對象是不可變的。數組

            StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數組保存字符,可是沒有用final關鍵字修飾,因此這兩種對象都是可變的。安全

StringBuilder StringBuffffer 的構造方法都是調用父類構造方法也就是 AbstractStringBuilder 實現的多線程

abstract class AbstractStringBuilder implements Appendable, CharSequence {
char[] value;
int count;
AbstractStringBuilder() {
}
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}

線程安全性app

String中的對象是不可變的,也就能夠理解爲常量,是線程安全的。AbstractStringBuilder 是StringBuilder和StringBuffer的公共父類,定義了一些字符串的基本操做,如expandCapacityappendinsertindexOf等公共方法。StringBuffer對方法或者對調用的方法加了同步鎖,因此是線程安全的。StringBuilder並無對方法加同步鎖,因此是非線程安全的。  性能

性能ui

每次對String類型進行改變時,都會生成一個新的String對象,而後將指針指向新的String對象spa

StringBuffer每次都會對StringBuffer對象自己進行操做,而不是生成新的對象並改變對象引用。相同狀況下使用StringBuilder比StringBuffer僅能得到10%~15%性能的提高,但卻要冒着多線程不安全的風險。線程

對三者使用的總結指針

1.操做少許的數據  = String

2.單線程操做字符串緩衝區下操做大量數據 = StringBuilder

3.多線程操做字符串緩衝區下操做大量數據 = StringBuffer

相關文章
相關標籤/搜索