字符串是應用中最普遍的存在,不容忽視。java
我是李福春,我在準備面試,今天咱們一塊兒來回答問題。面試
String,StringBuffer,StringBuilder的區別是什麼?數組
很是常見的面試題,一塊兒來發散一下。緩存
Java中最重要的類,提供了各類構造和管理字符串的操做;
它是Immutable類,即不可變,原生的保證了線程安全;
她的構造和各類操做都會產生一個新的String對象;因此要考慮內存和垃圾回收問題;安全
線程安全的,爲了解決String的操做產生不少中間String對象的問題。繼承自AbstractStringBudiler,同步方法是在對應的操做方法中簡單粗暴的加上syncronized關鍵字。數據結構
雖然不產生新的中間String對象,可是內部有一個數組負責存儲,提早設置合理大小能夠避免數組擴容引發的性能損耗。jvm
同StringBuffer,不過是線程非安全的。性能
java8底層已經把字符串的+操做自動轉換爲StringBuilder的拼接操做;優化
把jvm的堆轉儲,(dump heap)發現半數是重複的,若是能夠避免重複的字符串,能夠有效下降內存消耗和對象建立開銷。ui
能夠經過jvm的參數設置緩存池的大小 -XX:StringTableSize=x
intern是一種顯示的排重機制,可是不推薦使用;
最新的jdk8,使用G1 GC,指定字符串排重參數能夠達到底層去重的效果:
-XX:+UseStringDedumplication
好比使用本地內聯方法的intrinsic機制來優化字符串的操做速度;
改變StringBuilder的存儲的數據結構爲Compact Strings提升存儲效率;
本篇簡單的回答了String,StringBuffer,StringBuilder的區別。
而後分析了StringBuffer,StringBuilder底層代碼,提出來提早設置大小的優化建議;
字符串緩存是提升存儲效率的中重要途徑,最好使用jvm的參數進行調優。
原創不易,轉載請註明出處,歡迎溝通交流。