天天看點

String、StringBuilder和StringBuffer對象比較

String是不可變的對象,内部維護的char[]數組長度不可變,為final修飾,不存在擴容。在每次對String對象進行更新時,都是生成一個新的String對象,然後将指針指向新的String對象。

String、StringBuilder和StringBuffer對象比較
String、StringBuilder和StringBuffer對象比較
String、StringBuilder和StringBuffer對象比較

StringBuilder類内部維護的是可變長度的char[]數組,初始化數組容量為16,存在擴容;由于在調用append方法拼接字元串和擴容時,沒有用synchronize關鍵字修飾同步限制,是以是非線程安全的字元串操作類;其每次調用toString()方法而重新生成的String對象;

其append拼接字元串方法内部調用:Arrays.copyOf(value, newCapacity); 
其實際上是調用:System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
進行數組拷貝;不會重新生成新的StringBuilder對象。不會共享StringBuilder對象内部的char[],會進行一次char[]的copy操作。
      
String、StringBuilder和StringBuffer對象比較
String、StringBuilder和StringBuffer對象比較
String、StringBuilder和StringBuffer對象比較
String、StringBuilder和StringBuffer對象比較
String、StringBuilder和StringBuffer對象比較

StringBuffer類内部維護的是可變長度的char[]數組,實作原理基本上與StringBuilder一緻;但其為線程安全的字元串操作類;大部分方法都采用Synchronized關鍵字修飾,以此來實作在多線程下的操作字元串的安全性;其toString()方法而重新生成的String對象,會共享StringBuffer對象中的toStringCache屬性(char[]),但是每次的StringBuffer對象修改,都會将該屬性值置為null。