1. 程式人生 > >淺談String,StringBuffer,StringBuilder

淺談String,StringBuffer,StringBuilder

String,StringBuffer,StringBuilder的區別

三個類的區別

由三個類的原始碼可以看出,三者儲存字串都是儲存在字元char[]裡面

String類原始碼:

StringBuffer和StringBuilder的父類原始碼:

而String的陣列被修飾符final修飾,可見是不可修改的,而StringBuffer和StringBuilder原始碼提供了大量實用的操作字串的程式碼,對字串增刪查改非常方便。

執行緒是否安全

先說一下什麼才能叫做執行緒安全

執行緒安全就是多執行緒訪問時,採用了加鎖機制,當一個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。

執行緒不安全 就是不提供資料訪問保護,有可能出現多個執行緒先後更改資料造成所得到的資料是髒資料

上面說到的,String是不可變的,可以理解為常量,是安全的(原始碼中也加了同步鎖),這裡不做討論。

StringBuffer原始碼:

StringBuilder原始碼:

對比看得出,StringBuffer方法之前都加了synchronized關鍵字對方法進行了同步,保證了在同一個時間點只有一個方法可以執行該方法。而StringBuilder並不能保證同步,因此,StringBuffer是執行緒安全的而StringBuilder不是執行緒安全的。

三者的效能分析

這裡先引用一張實際的測試圖(引用)

這是測試三者在字串拼接的情況

很顯然,String並不適合定義常需要修改的字串,StringBuilder和StringBuffer只有微小的差別,個人認為主要是由於synchronized關鍵字,JVM需要進行判斷是否有程序衝突(個人意見)。

綜上,若字串不需要經常修改,用String足矣。若字串需要隨時根據需求而改變時,單執行緒的情況下可以用StringBuilder來實現,多執行緒的話還是使用StringBuffer吧。