MST

星途 面试题库

面试题:Java中StringBuffer的append方法源码核心逻辑是什么

请结合Java中StringBuffer类的append方法源码,阐述其实现将字符串追加到当前StringBuffer对象的核心逻辑,包括如何处理内部数组扩容等关键操作。
47.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

1. append方法的核心逻辑

StringBuffer类的append方法用于将各种类型的数据追加到当前StringBuffer对象的末尾。其核心逻辑主要围绕对内部字符数组char[]的操作。

append(String str)方法为例,其源码如下:

public synchronized StringBuffer append(String str) {
    toStringCache = null;
    if (str == null)
        str = "null";
    int len = str.length();
    ensureCapacityInternal(count + len);
    str.getChars(0, len, value, count);
    count += len;
    return this;
}
  1. 参数处理
    • 首先检查传入的String对象是否为null,如果是,则将其替换为字符串"null"
  2. 计算新容量并扩容
    • 计算追加字符串后的总长度count + lencount是当前StringBuffer对象已有的字符数量,len是要追加的字符串长度。
    • 调用ensureCapacityInternal(count + len)方法确保内部数组value有足够的容量来容纳新的字符。ensureCapacityInternal方法如下:
private void ensureCapacityInternal(int minimumCapacity) {
    // overflow-conscious code
    if (minimumCapacity - value.length > 0)
        expandCapacity(minimumCapacity);
}
- 这里判断如果所需的最小容量`minimumCapacity`大于当前数组`value`的长度,就调用`expandCapacity`方法进行扩容。`expandCapacity`方法如下:
void expandCapacity(int minimumCapacity) {
    int newCapacity = value.length * 2 + 2;
    if (newCapacity - minimumCapacity < 0)
        newCapacity = minimumCapacity;
    if (newCapacity < 0) {
        if (minimumCapacity < 0) // overflow
            throw new OutOfMemoryError();
        newCapacity = Integer.MAX_VALUE;
    }
    value = Arrays.copyOf(value, newCapacity);
}
- 扩容时,新的容量`newCapacity`为当前数组长度的两倍加2。如果新容量仍小于所需的最小容量`minimumCapacity`,则将新容量设置为`minimumCapacity`。如果新容量小于0(即发生溢出),根据`minimumCapacity`是否小于0来决定是抛出`OutOfMemoryError`还是将新容量设置为`Integer.MAX_VALUE`。最后通过`Arrays.copyOf`方法将原数组内容复制到新的更大的数组中。

3. 追加字符: - 调用要追加字符串的getChars方法,将其字符复制到当前StringBuffer对象的内部数组value中,从count位置开始存储。 - 更新count的值,使其反映追加后的总字符数。 4. 返回对象: - 最后返回当前StringBuffer对象,以便支持链式调用。

总结

append方法通过上述步骤,实现了将字符串追加到StringBuffer对象的功能,同时在需要时对内部数组进行合理的扩容,以保证能够容纳新追加的内容。