String是典型的Immutable(不可變)類,被聲明爲final class,全部屬性都是final的。因爲它的不可變性,相似拼接、截取字符串等操做都會產生新的String對象,每每編碼中經常對字符串進行操做,因此操做的效率每每對應用性能有明顯影響。java
StringBuffer 是爲了解決上面提到的因拼接產生太多中間對象問題而提供的一個類,咱們能夠用append 或者add方法,把字符串添加到已有序列末尾或者指定位置。StringBuffer本質是一個線程安全的可修改字符序列,它保證了線程安全(經過把各類修改數據的方法都加上synchronized關鍵字實現),也隨之帶來了額外的性能開銷,若無線程安全的須要,可使用StringBulider。數組
深刻分析:緩存
1.字符串的設計和實現考量安全
StringBuffer 和StringBulider底層都是利用可修改的數組(java9是byte)數組,兩者都繼承了AbstractStringBulider,裏面包含了基本操做,區別僅僅在於方法是否加了synchronized。app
這個數組構建時是初始字符串長度加16,若是沒有構建時輸入最初的字符串,那麼初始值就是16。若是咱們能預估須要的大小,最好制定其大小,避免屢次擴容帶來的開銷,擴容須要建立新的數組,還要進行arrayCopy。ide
//不帶字符串初始化,默認分配16byte StringBuilder stringBuilder = new StringBuilder(); //帶字符串初始化,初始化字符串長度+16byte StringBuilder sb = new StringBuilder().append("nihao").append("ggsimida"); //指定大小50byte StringBuilder ssb = new StringBuilder(50).append("nihao").append("ggsimida");
2.字符串緩存性能
各版本jdk的實現ui
3.String自身演化編碼
java9將字符串存儲方式從char數組,改變爲一個byte數組加上一個標識編碼的coder,極端狀況下最長字符串大小變小了,可是緊湊型字符串優點巨大,更小的內存,更快的操做速度。spa