gpt4 book ai didi

java - 当 StringBuffer 超出容量时,是否会创建一个新的 StringBuffer 对象,或者仍然是旧的?

转载 作者:行者123 更新时间:2023-12-02 10:55:04 28 4
gpt4 key购买 nike

当 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
深(掌握*)LanguagePackageInJava $ java测试
输出:16
16
34
正确

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

最佳答案

线路

StringBuffer sb2 = sb;

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

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

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

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

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

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

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

关于java - 当 StringBuffer 超出容量时,是否会创建一个新的 StringBuffer 对象,或者仍然是旧的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51830248/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com