String,StringBuffer 和 StringBuilder 的區(qū)別是什么? String 為什么是不可變的?

主要從三個方面談這三個類的區(qū)別:

  • 可變性
  • 線程安全性
  • 性能

可變性

String為什么是不可變的?
String內(nèi)部實現(xiàn)其實是private final char value[], 所以String對象是不可變的.

StringBuilder與StringBuffer都繼承自AbstractStringBuilder類.
AbstractStringBuilder是用char[] value來存儲字符串的, 但是沒有用final關(guān)鍵字, 所以StringBuilder和StringBuffer對象都是可變的.

線程安全性

String中的對象是不可變的, 可以理解成常量, 是線程安全的.

AbstractStringBuilder是StringBuilder和StringBuffer的公共父類, 定義了一些字符串的操作方法, 如常用的append用于字符串拼接, indexOf用于字符串查找等.

StringBuffer對方法加了同步鎖或者對調(diào)用的方法加了同步鎖, 所以是線程安全的.

而StringBuilder并沒有對方法家同步鎖, 所以是非線程安全的.

性能

對于String對象而言, 每次都會生成一個新的String對象, 然后將指針指向新的String對象.

StringBuffer和StringBuilder每次都會對對象本身進行操作, 而不是生成新的對象并且改變對象的引用. 相同情況下使用StringBuilder會比StringBuffer獲得10%-15%的性能提升, 但是要承擔多線程不安全的風險.

總結(jié)

少量數(shù)據(jù)用String
單線程大量數(shù)據(jù)用StringBuilder
多線程大量數(shù)據(jù)用StringBuffer

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容