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

可變性
String 類中使用 final 關鍵字修飾的字符數組保存字符串, private final char value[] ,所以 String 對象是不可變的。
而StringBuilder 與 StringBuffer 都繼承自 AbstractStringBuilder 類,在 AbstractStringBuilder 中也是使用字符數組保存字符串char[]value 但是沒有用 final 關鍵字修飾,所以這兩種對象都是可變的。

線程安全性
String 中的對象是不可變的,也就可以理解爲常量,線程安全。
StringBuffer 對方法加了同步鎖或者對調用的方法加了同步鎖,所以是線程安全的。
StringBuilder 並沒有對方法進行加同步鎖,所以是非線程安全的。

性能
每次對 String 類型進行改變的時候,都會生成一個新的 String 對象,然後將指針指向新的 String 對象,性能比較低。
StringBuffer 每次都會對 StringBuffer 對象本身進行操作,而不是生成新的對象並改變對象引用,性能較高。
相同情況下使用 StirngBuilder 相比使用 StringBuffer 可以獲得 10%~15% 左右的性能提升,但是需要承擔多線程不安全的風險。

對於三者使用的總結:
1. 操作少量的數據 = String
2. 單線程操作字符串緩衝區下操作大量數據 = StringBuilder
3. 多線程操作字符串緩衝區下操作大量數據 = StringBuffer

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章