String、StringBuffer和StringBuilder String是java里一個常用類,關於String從源碼中我們可以知道String是不可以有子類的。 String類由final修飾,是不能有子類的。 String實現了序列化介面(Serializable),預示著String對 ...
String是java里一個常用類,關於String從源碼中我們可以知道String是不可以有子類的。
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
...
}
String類由final修飾,是不能有子類的。
String實現了序列化介面(Serializable),預示著String對象是可序列化的。
另外還實現了Comparable和CharSequence介面。
String對象一旦初始化就不能再改變了,即使調用其字元拼接等方法,也只是拼接得到一個新的String對象。
虛擬機提供了一個字元串常量池,相同的字元串再常量池中只有一個,用到相同字元串時直接引用同意字元串常量。String類提供了一個intern方法可以將字元串加到常量池中,即使已經有同樣的字元串。
String s1 = "str";
String s2 = "str";
String s3 = new String("str");
s3.intern();
可以看到s1和s2引用的同一個字元串,而調用intern方法之後的s3引用的是另一個“str”。
在程式中頻繁的拼接、修改、剪切字元串時,如果使用String類勢必會在常量池中產生大量字元串,那就需要使用StringBuffer和StringBuilder了。
StringBuffer和StringBuilder是可修改的字元串類。這兩個類都是繼承於AbstractStringBuilder並實現了Serializable和CharSequence介面,因此使用方法大體一致。
//StringBuffer中的append(String str)方法
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
//StringBuilder中的append(String str)方法
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
從源碼中可以看到這兩個方法類似,具體的操作都是調用父類的append方法。但是在兩個類的源碼對比中可以發現StringBuffer的大部分方法都有synchronized修飾而StringBuilder沒有。
synchronized可以保證在同一時刻只有一個方法進入臨界區,因此StringBuffer類時線程安全的,而StringBuilder是線程不安全的。
在單線線程中StringBuffer和StringBuilder使用沒有太大區別,而在多線程中使用StringBuffer更合適。
private int newCapacity(int minCapacity) {
// overflow-conscious code
int newCapacity = (value.length << 1) + 2;
if (newCapacity - minCapacity < 0) {
newCapacity = minCapacity;
}
return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
? hugeCapacity(minCapacity)
: newCapacity;
}
AbstractStringBuilder類中的方法。從這個方法可以看出字元數組的增長方式是原大小*2+2。