当 StringBuffer 容量用完时,是创建了一个新的 StringBuffer 对象,还是它仍然是旧的?

Is a new StringBuffer object created when the StringBuffer goes out of capacity or it remains still the old one?

当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);
 }
}

输入: 深(master *) LanguagePackageInJava $ javac Lecture7.java
深 (master *) LanguagePackageInJava $ java 测试
输出: 16
16
34

在上面的代码中,我试图创建一个 StringBuffer 对象 sb 并将其引用复制到另一个 StringBuffer 对象 sb2当 StringBuffer sb 为空时。我试图溢出 sb 的容量,然后通过比较 sb2 和 [=17= 来尝试是否创建了一个新对象]某人。但它 returns 是真的。我想没有创建任何对象。但是即使在阅读了文档之后我也不太确定。如有任何帮助,我们将不胜感激!

显然,它保持不变。首先,你比较sbsb2,它们是一样的,其次,你没有对sb做任何赋值,所以它只能和以前一样。

StringBuffer sb2 = sb;

不会创建 sb 对象的副本。它只会创建对同一对象的另一个引用。现在你有两个 StringBuffer 对同一个 StringBuffer 对象的引用。

sb  -------> StringBuffer
          /
sb2 ------

如果 StringBuffer 的容量溢出,它将为内容重新分配一个内部缓冲区。

sb  -------> StringBuffer ----XXXXXXX"abcdefghijklmnop"
          /                  \
sb2 ------                    ------>"abcdefghijklmnopq"

用作内容缓冲区的内部数组将是一个新创建的对象。旧缓冲区最终将被垃圾收集。

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

此外,您可以将 StringBuffer 替换为 StringBuilder,上面的其余部分不会改变。