当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。我想还没有创建对象。但是即使阅读了文档,我也不太确定。任何帮助将不胜感激!
答案 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)
显然,它保持不变。首先,您比较sb
和sb2
,它们是相同的;其次,您没有对sb
进行任何分配,因此只能与以前相同。>