01.03 String、StringBuffer與StringBuilder的區別以及類之間的關係

三者區別

String 不可變字符串,另外兩個是可變的。

StringBuffer 可變字符串,是線程安全的內部用的synchronized 做的線程安全。

StringBuilder 可變字符串,非線程安全。

從類關係圖看


String、StringBuffer與StringBuilder的區別以及類之間的關係

String類圖

String、StringBuffer與StringBuilder的區別以及類之間的關係

StringBuffer類圖


String、StringBuffer與StringBuilder的區別以及類之間的關係

StringBuilder類圖


CharSequence


String、StringBuffer與StringBuilder的區別以及類之間的關係

CharSequence中的方法

可以看到String、StringBuffer與StringBuilder都實現了CharSequence接口。

CharSequence是一個接口,表示char值的一個可讀序列。此接口對許多不同種類的char序列提供統一的自讀訪問。此接口不修改該equals和hashCode方法的常規協定,因此,通常未定義比較實現CharSequence 的兩個對象的結果。

CharSequence與String都能用於定義字符串,但CharSequence的值是可讀可寫序列,而String的值是隻讀序列。

對於一個抽象類或者是接口類,不能使用new來進行賦值,但是可以通過以下的方式來進行實例的創建:CharSequence cs = "pine";

Appendable


String、StringBuffer與StringBuilder的區別以及類之間的關係

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接口。


分享到:


相關文章: