面试题答案
一键面试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;
}
- 参数处理:
- 首先检查传入的
String
对象是否为null
,如果是,则将其替换为字符串"null"
。
- 首先检查传入的
- 计算新容量并扩容:
- 计算追加字符串后的总长度
count + len
,count
是当前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
对象的功能,同时在需要时对内部数组进行合理的扩容,以保证能够容纳新追加的内容。