Java 当StringBuffer的容量不足时,是创建了一个新的StringBuffer对象,还是仍然是旧的?

Java 当StringBuffer的容量不足时,是创建了一个新的StringBuffer对象,还是仍然是旧的?,java,object,garbage-collection,stringbuffer,Java,Object,Garbage Collection,Stringbuffer,当StringBuffer的容量不足时,是创建了一个新的StringBuffer对象,还是仍然是旧的 class Test{ public static void main(String[] args) { StringBuffer sb = new StringBuffer(); StringBuffer sb2 = sb; System.out.println(sb.capacity()); sb.append("abcdefghijklmnop");

当StringBuffer的容量不足时,是创建了一个新的StringBuffer对象,还是仍然是旧的

class Test{
public static void main(String[] args) {
    StringBuffer sb = new StringBuffer();
    StringBuffer sb2 = sb;
    System.out.println(sb.capacity());
    sb.append("abcdefghijklmnop");
    System.out.println(sb.capacity());
    sb.append("q");
    System.out.println(sb.capacity());
    System.out.println(sb == sb2);
 }
}
输入:deep(master*)语言包Injava$javac讲师7.java
deep(master*)语言包Injava$java测试
输出:16
16
34
正确


在上面的代码中,我尝试创建一个StringBuffer对象sb,并在StringBuffersb为空时将其引用复制到另一个StringBuffer对象sb2。我尝试过溢出sb的容量,然后通过将sb2sb进行比较,尝试是否创建了新对象。但它又回到了现实。我想还没有创建对象。但即使在阅读了文档之后,我也不太确定。任何帮助都将不胜感激

显然,它保持不变。首先,您比较了
sb
sb2
,它们是相同的,其次,您没有对
sb
进行任何赋值,因此它只能与以前相同。

StringBuffer sb2 = sb;
不创建
sb
对象的副本。它仅创建对同一对象的另一个引用。现在您有两个
StringBuffer
对同一
StringBuffer
对象的引用

sb  -------> StringBuffer
          /
sb2 ------
如果
StringBuffer
的容量溢出,它将为内容重新分配一个内部缓冲区

sb  -------> StringBuffer ----XXXXXXX"abcdefghijklmnop"
          /                  \
sb2 ------                    ------>"abcdefghijklmnopq"
用作内容缓冲区的内部数组将是一个新创建的对象。旧的缓冲区最终将被垃圾回收

但是,
StringBuffer
对象本身不会被替换。当您将某些内容附加到
StringBuffer
时,它总是返回对自身的引用。您将忽略它,但即使您将返回值重新分配回
sb
,它仍然引用同一个对象


此外,您可以将
StringBuffer
替换为
StringBuilder
,上述其余内容不会更改。

是的,我应该存储append函数的返回值,然后将其与sb进行比较。我这样做了…但它仍然给出了相同的对象