在Java中StringBuilder是继承AbstractStringBuilder,在AbstractStringBuilder是byte[] value; 存放字符内容
public AbstractStringBuilder append(String str) {
if (str == null) {
return appendNull();
}
int len = str.length();
ensureCapacityInternal(count + len);
putStringAt(count, str); //这里
count += len;
return this;
}
private final void putStringAt(int index, String str) {
if (getCoder() != str.coder()) {
inflate();
}
str.getBytes(value, index, coder);
}
//在StringBuilder源码中toString,新string对象
public String toString() {
// Create a copy, don't share the array
return isLatin1() ? StringLatin1.newString(value, 0, count)
: StringUTF16.newString(value, 0, count);
}
具体你可以看源码!
源码我看了。主要是appent方法的返回值是this,这个返回值的时候会不会新创建一个StringBuilder对象?主要是这个。
@丫头的小橙子: 你看了还不明白吗? append的时候不会产生新String的对象,只有在toString的产生新的String对象
@秋壶冰月 appent的时候我知道不会新建string对象,我想知道的是会不会在appent的时候新建一个Stringbuilder的对象。
@丫头的小橙子: 这个还是看源码呀,在append函数中,ensureCapacityInternal函数,value空间不够用的时候,才会进行分配内存,将原有value内容拷贝到新的分配。但不会产生新的StringBuilder对象。
···java
StringBuilder builer = new StringBuilder(); //在构造函数中,默认分配16,char value[];
···
还有感觉你纠结的地方不太对。才要知道内部怎么实现的。一定要看源码。每个jdk源码版本可能不太一样,以自己的版本分析。
好阔怕的面试题…