String、StringBuilder和StringBuffer對象比較

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章