StringBuilder和StringBuffer
StringBuffer和StringBuilder ,使用append()追加字符串的时候,都是同一个对象,里面的源代码如下:
StringBuffer 源代码如下文:
@Override public synchronized StringBuffer append(String str) { toStringCache = null; super.append(str); return this; }
StringBuilder 源代码如下:
@Override public StringBuilder append(String str) { super.append(str); return this; }
从上面的源代码可以看出:StringBuffer 是线程安全的,StringBuilder 是线程不安全的。而它们都共同调用 super.append(str),源代码如下:
public AbstractStringBuilder append(String str) { if (str == null) return appendNull(); int len = str.length(); ensureCapacityInternal(count + len); str.getChars(0, len, value, count); count += len; return this; }
这里面要注意的一点的是,这个 ensureCapacityInternal(count + len),其中的源代码如下:
private void ensureCapacityInternal(int minimumCapacity) { // overflow-conscious code if (minimumCapacity - value.length > 0) { value = Arrays.copyOf(value, newCapacity(minimumCapacity)); } }
这里的value,是一个char[]。从这里可以看出
1、如果value 这个char[]容量不足,则会新建一个char[]。if (minimumCapacity - value.length > 0) 这个代码的写法有点难懂,写成:if (minimumCapacity >value.length) 会更容易懂。
2、如果value的char[]容量足够,则继续使用这个char[]。
----------------------------------------------------------------------------------
这里也可以看出,为什么少量的字符串操作是使用String,而大量的字符串追加是使用StringBuffer 和StringBuilder 了