StringBuffer的解读(一)

简介: 对于StringBuffer的解读所有的源代码都是jdk1.8.0_202。append(String str)方法的实现,代码如下:@Overridepublic synchronized StringBuffer append(String str) { toStringCache = null; super.append(str);//直接调用父类的append方法。

对于StringBuffer的解读

所有的源代码都是jdk1.8.0_202。

  • append(String str)方法的实现,代码如下:
@Override
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);//直接调用父类的append方法。
    return this;
}

其中调用了其父类AbstractStringBuilderde的append(String 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;
}

其中appendNull方法,代码如下:

private AbstractStringBuilder appendNull() {
    int c = count;
    ensureCapacityInternal(c + 4);
    final char[] value = this.value;
    value[c++] = 'n';
    value[c++] = 'u';
    value[c++] = 'l';
    value[c++] = 'l';
    count = c;
    return this;
}

其中ensureCapacityInternal方法,代码如下:

private void ensureCapacityInternal(int minimumCapacity) {
    // overflow-conscious code
    if (minimumCapacity - value.length > 0) {
        value = Arrays.copyOf(value,
                newCapacity(minimumCapacity));
    }
}

其中newCapacity方法,代码如下:

private int newCapacity(int minCapacity) {
    // overflow-conscious code
    int newCapacity = (value.length << 1) + 2;
    if (newCapacity - minCapacity < 0) {
        newCapacity = minCapacity;
    }
    return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
        ? hugeCapacity(minCapacity)
        : newCapacity;
}

我们再看看hugeCapacity是搞什么的,代码如下:

private int hugeCapacity(int minCapacity) {
    if (Integer.MAX_VALUE - minCapacity < 0) { // overflow
        throw new OutOfMemoryError();
    }
    return (minCapacity > MAX_ARRAY_SIZE)
        ? minCapacity : MAX_ARRAY_SIZE;
}

代码差不多了,总结一下:

  1. append方法大部分实现是在AbstractStringBuilder中
  2. 如果append的是null,直接将null这4个字符加在后面
  3. 如果不是null,原本剩余容量能接纳新的String,调用String.getChars()方法将新的字符串加进去,里面各种边界检查之后,调用的是System.arraycopy()方法,这是一个native的方法,依赖于底层的实现。
  4. 原本容量不够,好的,容量double之后+2,还不够吗?好的,就用你给的参数值(就是原本字符数量+需要加进去的字符数量)。再通过Arrays.copyOf()方法,先复制原先的字符,最后回append方法中,走第3步中String.getChars()方法。
目录
相关文章
|
5月前
|
Java
为什么需要StringBuffer
为什么需要StringBuffer
为什么需要StringBuffer
|
7月前
StringBuilder和StringBuffer区别是什么?
StringBuilder和StringBuffer区别是什么?
|
7月前
|
缓存 安全 调度
StringBuilder和StringBuffer的区别
StringBuilder和StringBuffer的区别
|
安全
【StringBuilder和StringBuffer】
【StringBuilder和StringBuffer】
41 0
可变字符串StringBuffer和StringBuilder
可变字符串StringBuffer和StringBuilder
StringBuffer 方法
StringBuffer 方法
153 0
StringBuffer方法
快速学习StringBuffer方法
|
SQL 安全 Java
你还在使用 StringBuffer ?
Java中常用字符串处理类包括 String、StringBuffer 和 StringBuilder ,当对字符串进行修改的时候,使用 StringBuffer 和 StringBuilder 一般比使用 String 效率更高。因为 StringBuffer 的内部实现方式和 String 不同,StringBuffer 在进行字符串处理时,不生成新的对象,在速度和内存使用上都要优于 String。
你还在使用 StringBuffer ?
|
机器学习/深度学习 安全 Java