三者区别
String 不可变字符串,另外两个是可变的。
StringBuffer 可变字符串,是线程安全的内部用的synchronized 做的线程安全。
StringBuilder 可变字符串,非线程安全。
从类关系图看
CharSequence
CharSequence中的方法
可以看到String、StringBuffer与StringBuilder都实现了CharSequence接口。
CharSequence是一个接口,表示char值的一个可读序列。此接口对许多不同种类的char序列提供统一的自读访问。此接口不修改该equals和hashCode方法的常规协定,因此,通常未定义比较实现CharSequence 的两个对象的结果。
CharSequence与String都能用于定义字符串,但CharSequence的值是可读可写序列,而String的值是只读序列。
对于一个抽象类或者是接口类,不能使用new来进行赋值,但是可以通过以下的方式来进行实例的创建:CharSequence cs = "pine";
Appendable
Appendable接口中的方法
明显能够看到主要是用于定义拼接方法的接口类。
下面看一个append实现方法。
@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;
}
从方法中不难看出为啥我们拼接为NULL的对象是为啥拼接的字符串是“null”了。
另外Formatter相关的类也会实现Appendable接口。