String是不可變的對象,內部維護的char[]數組長度不可變,爲final修飾,不存在擴容。在每次對String對象進行更新時,都是生成一個新的String對象,然後將指針指向新的String對象。
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操作。
StringBuffer類內部維護的是可變長度的char[]數組,實現原理基本上與StringBuilder一致;但其爲線程安全的字符串操作類;大部分方法都採用Synchronized關鍵字修飾,以此來實現在多線程下的操作字符串的安全性;其toString()方法而重新生成的String對象,會共享StringBuffer對象中的toStringCache屬性(char[]),但是每次的StringBuffer對象修改,都會將該屬性值置爲null。