面試刷題5:String StringBuffer StringBuilder區別?

面試刷題5:String StringBuffer StringBuilder區別?

字符串是應用中最廣泛的存在,不容忽視。

我是李福春,我在準備面試,今天我們一起來回答問題。

String,StringBuffer,StringBuilder的區別是什麼?

非常常見的面試題,一起來發散一下。

String

Java中最重要的類,提供了各種構造和管理字符串的操作;
它是Immutable類,即不可變,原生的保證了線程安全;
她的構造和各種操作都會產生一個新的String對象;所以要考慮內存和垃圾回收問題;

StringBuffer

線程安全的,為了解決String的操作產生很多中間String對象的問題。繼承自AbstractStringBudiler,同步方法是在對應的操作方法中簡單粗暴的加上syncronized關鍵字。

雖然不產生新的中間String對象,但是內部有一個數組負責存儲,提前設置合理大小可以避免數組擴容引起的性能損耗。

StringBuilder

同StringBuffer,不過是線程非安全的。

java8底層已經把字符串的+操作自動轉換為StringBuilder的拼接操作;

字符串緩存

把jvm的堆轉儲,(dump heap)發現半數是重複的,如果可以避免重複的字符串,可以有效降低內存消耗和對象創建開銷。

可以通過jvm的參數設置緩存池的大小 -XX:StringTableSize=x

intern是一種顯示的排重機制,但是不推薦使用;

最新的jdk8,使用G1 GC,指定字符串排重參數可以達到底層去重的效果:

-XX:+UseStringDedumplication

其它字符串的底層優化

比如使用本地內聯方法的intrinsic機制來優化字符串的操作速度;

改變StringBuilder的存儲的數據結構為Compact Strings提高存儲效率;

小結

本篇簡單的回答了String,StringBuffer,StringBuilder的區別。
然後分析了StringBuffer,StringBuilder底層代碼,提出來提前設置大小的優化建議;

字符串緩存是提高存儲效率的中重要途徑,最好使用jvm的參數進行調優。

面試刷題5:String StringBuffer StringBuilder區別?


分享到:


相關文章: