String - Java語言中很是基礎和重要的類,提供了構造和管理字符串的各類基本邏輯。它是典型的Immutable類,被聲明成爲final class,全部屬性也都是final的。也因爲它的不可變性,相似拼接、剪裁字符串等操做,都會產生新的String對象。因爲字符串操做的廣泛性,因此有關操做的效率每每對應用性能有明顯影響。安全
String是Immutable類的典型實現,原生的保證了基礎線程安全,由於你沒法對它內部數據進行任何修改,這種便利甚至體如今拷貝構造函數中,因爲不可變,Immutable對象在拷貝時不須要額外複製數據。多線程
StringBuffer - 是爲解決上面提到拼接產生太多中間對象的問題而提供的一個類,咱們能夠用append或者add的方法,把字符串添加到已有序列的末尾或者指定位置。StringBuffer本質是一個線程安全的可修改字符序列,它保證了線程安全,也隨之帶來了額外的性能開銷,因此除非有線程安全的須要,否則仍是推薦使用它的後繼者 - StringBuilder。app
StringBuffer的線程安全是經過把各類修改數據的方法都加上synchronized關鍵字實現的,很是直白。函數
StringBuilder - 是Java1.5中新增的,在能力上面和StringBuilder沒有本質區別,可是它去掉了線程安全的部分,有效減少了開銷,是絕大部分狀況下進行字符串拼接的首選。性能
應用場景ui
【A】在字符串內容不常常發生變化的業務場景優先使用String,例如:常量聲明、少許的字符串拼接操做等。若是有大量的字符串內容拼接,避免使用String與String之間的「+」操做,由於這樣會產生大量無用的中間對象,耗費空間且執行效率低下(新建對象、回收對象花費大量時間)。線程
【B】在頻繁進行字符串的運算(如拼接、替換、刪除等),而且運行在多線程環境下,建議使用StringBuffer,例如XML解析、HTTP參數解析與封裝。對象
【C】在頻繁進行字符串的運算,而且運行在但線程環境中,建議使用StringBuilder,例如SQL語句拼裝、JSON封裝等。字符串