【问题标题】:Is a new StringBuffer object created when the StringBuffer goes out of capacity or it remains still the old one?当 StringBuffer 容量不足时是否创建了一个新的 StringBuffer 对象,或者它仍然是旧的?
【发布时间】:2019-01-20 15:37:53
【问题描述】:

当 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
deep (master *) LanguagePackageInJava $ java Test
输出:16
16
34
真的

在上面的代码中,我尝试创建一个StringBuffer对象sb,并在StringBuffersbsb2 /strong> 为空。我试图溢出sb的容量,然后通过比较sb2sb来尝试是否创建了一个新对象。但它返回真。我想没有对象被创建。但即使在阅读了文档之后,我也不太确定。任何帮助将不胜感激!

【问题讨论】:

    标签: java object garbage-collection stringbuffer


    【解决方案1】:

    线

    StringBuffer sb2 = sb;
    

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

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

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

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

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

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

    另外,您可以将StringBuffer 替换为StringBuilder,以上内容不会改变。

    【讨论】:

    • 是的,我应该存储 append 函数的返回值,然后将其与 sb 进行比较……我做到了……但它仍然给出了相同的对象
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 2017-02-24
      • 2011-09-11
      • 2018-07-24
      • 1970-01-01
      • 2016-11-17
      相关资源
      最近更新 更多