当StringBuffer容量不足或仍旧时,是否会创建一个新的StringBuffer对象?

时间:2018-08-13 20:41:25

标签: 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");
    System.out.println(sb.capacity());
    sb.append("q");
    System.out.println(sb.capacity());
    System.out.println(sb == sb2);
 }
}

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

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

2 个答案:

答案 0 :(得分:1)

StringBuffer sb2 = sb;

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

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

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

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

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

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

此外,您可以将StringBuffer替换为StringBuilder,其余的内容将保持不变。

答案 1 :(得分:0)

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