字符串是應用中最廣泛的存在,不容忽視。
我是李福春,我在準備面試,今天我們一起來回答問題。
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的參數進行調優。
閱讀更多 李福春 的文章