大部分情況下:StringBuilder > StringBuffer > String
String
String類是不可變類,即一旦一個String對象被創建以後,包含在這個對象中的字符序列是不可改變的,直至這個對象被銷燬。
如果對 String 類型進行改變,其實等同於生成了一個新的 String 對象,原對象如果沒有被再次引用 則會被GC
StringBuffer
StringBuffer對象則代表一個字符序列可變的字符串,它沒有重新生成一個對象,而是在原來的對象中連接新的字符串。
StringBuffer類中的方法都添加了synchronized關鍵字,也就是給這個方法添加了一個鎖,用來保證線程安全。
StringBuilder
StringBuilder沒有實現線程安全,所以性能略高。
Java9的改進
Java9改進了字符串(包括String、StringBuffer、StringBuilder)的實現。
在Java9以前字符串採用 char[] 數組來保存字符,因此字符串的每個字符佔 2 字節;
而Java9的字符串採用 byte[] 數組再加一個encoding-flag字段來保存字符,因此字符串的每個字符只佔 1 字節。所以Java9的字符串更加節省空間,字符串的功能方法也沒有受到影響。