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 了

 

posted on 2019-04-03 09:39  drafire  阅读(108)  评论(0编辑  收藏  举报