三者區別
String 不可變字符串,另外兩個是可變的。
StringBuffer 可變字符串,是線程安全的內部用的synchronized 做的線程安全。
StringBuilder 可變字符串,非線程安全。
從類關係圖看
CharSequence
可以看到String、StringBuffer與StringBuilder都實現了CharSequence接口。
CharSequence是一個接口,表示char值的一個可讀序列。此接口對許多不同種類的char序列提供統一的自讀訪問。此接口不修改該equals和hashCode方法的常規協定,因此,通常未定義比較實現CharSequence 的兩個對象的結果。
CharSequence與String都能用於定義字符串,但CharSequence的值是可讀可寫序列,而String的值是隻讀序列。
對於一個抽象類或者是接口類,不能使用new來進行賦值,但是可以通過以下的方式來進行實例的創建:CharSequence cs = "pine";
Appendable
明顯能夠看到主要是用於定義拼接方法的接口類。
下面看一個append實現方法。
<code>@Override
public AbstractStringBuilder append(CharSequence s, int start, int end) {
if (s == null)
s = "null";
if ((start < 0) || (start > end) || (end > s.length()))
throw new IndexOutOfBoundsException(
"start " + start + ", end " + end + ", s.length() "
+ s.length());
int len = end - start;
ensureCapacityInternal(count + len);
for (int i = start, j = count; i < end; i++, j++)
value[j] = s.charAt(i);
count += len;
return this;
}/<code>
從方法中不難看出為啥我們拼接為NULL的對象是為啥拼接的字符串是“null”了。
另外Formatter相關的類也會實現Appendable接口。
閱讀更多 JAVA破局之路 的文章