Java基礎總結(1)——String, StringBuffer and StringBuilder
阿新 • • 發佈:2018-12-20
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。