1. 程式人生 > >Java基礎總結(1)——String, StringBuffer and StringBuilder

Java基礎總結(1)——String, StringBuffer and StringBuilder

String, StringBuffer and StringBuilder用法總結

1. 可變性

  • String不可變
  • StringBuffer 和 StringBuilder 可變

原因如下:

String類中使用final關鍵字字元陣列儲存字串,private final char value[],所以String物件是不可變的。而StringBuilder和StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字元陣列char[] value儲存字串,但是沒有用final關鍵字修飾,所以兩種物件是可變的。

abstract
class AbstractStringBuilder implements Appendable, CharSequence { char[] value; int count; AbstractStringBuilder() { } AbstractStringBuilder(int capacity) { value = new char[capacity]; }

2 .執行緒安全

  • String 不可變,因此是執行緒安全的
  • StringBuilder 不是執行緒安全的
  • StringBuffer 是執行緒安全的,內部使用 synchronized 進行同步

String 中的物件是不可變的,也就可以理解為常量,執行緒安全。AbstractStringBuilder 是 StringBuilder 與 StringBuffer 的公共父類,定義了一些字串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 對方法加了同步鎖或者對呼叫的方法加了同步鎖,所以是執行緒安全的。StringBuilder 並沒有對方法進行加同步鎖,所以是非執行緒安全的。

有時候需要用較短的字串構建字串,如果採用String每次連線字元等都會構建一個新的String物件,耗時耗空間,使用StringBuilder可以避免該問題。

如果需要用許多小段字串構建一個字串應該按照如下步驟:

StringBuilder builder = new StringBuilder();
//每次新增內容呼叫append方法
builder.append(ch);
builder.append(str);
//構建字串得到String物件需要呼叫toString方法
String completedString = builder.toString();

使用總結:操作少量資料使用String,單執行緒下大量資料使用StringBuilder,多執行緒下大量資料使用StringBuffer。