Java 当StringBuffer的容量不足时,是创建了一个新的StringBuffer对象,还是仍然是旧的?
当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");
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.javadeep(master*)语言包Injava$java测试
输出:16
16
34
正确
在上面的代码中,我尝试创建一个StringBuffer对象sb,并在StringBuffersb为空时将其引用复制到另一个StringBuffer对象sb2。我尝试过溢出sb的容量,然后通过将sb2与sb进行比较,尝试是否创建了新对象。但它又回到了现实。我想还没有创建对象。但即使在阅读了文档之后,我也不太确定。任何帮助都将不胜感激 显然,它保持不变。首先,您比较了
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进行比较。我这样做了…但它仍然给出了相同的对象