StringBuilder在每次操作时是否会创建新的字符串?

5

这段代码创建了多少个对象?我知道3个字符串字面量在字符串常量池中,而StringBuilder对象在堆中。但是当我调用reverse()、insert()或append()方法时,它是否会在常量池中创建一个新的字符串?

StringBuilder sb = new StringBuilder("abc");
sb.append("def").reverse().insert(3, "---");
System.out.println( sb );

1
我找到了这个链接 :) 如果你想更多地了解它,它可以帮助你。 - Marco Acierno
非常有帮助!现在我知道它是如何内部工作的。 - GabrielBB
3个回答

7

StringBuilder 类只有在调用 toString() 方法时才会创建一个新的字符串。在此之前,它会保持一个所有添加进去的元素所组成的 char[] 数组。

任何你执行的操作,比如 insert 或者 reverse,都是在该数组上执行的。


关于 intern 方法怎么样? - Kick
它将插入到char[]数组中。非常高效。 - wizulus
当我们调用append(String str)时,JVM不会创建另一个字符串对象吗? - RP-
好的答案。谢谢。(正在准备Java 6认证考试) - GabrielBB
@GabrielBB @alancnet,总体来说会有4个对象还是只有1个对象?我认为当我们调用append(String str)方法时,首先必须正确创建str对象。 - RP-
4个对象,不包括内部的Char[]数组(“我知道3个字符串字面量在字符串常量池中,StringBuilder对象在堆上”) - GabrielBB

3

创建的字符串:"abc", "def", "---"

创建的字符串构建器:sb

sb.append("def").reverse().insert(3, "---") 并没有创建新的对象,只是编辑了 StringBuilder 的内部缓冲区(这就是为什么推荐使用 StringBuilder 来提高性能)。


@alancnet 回复对象的 char[] 参数与此回复相矛盾。 - Srinath Ganesh
1
实际上除了"abc""def""---"之外,还有一个字符串。System.out.println使用String.valueOf,它会在传递的对象上调用toString()方法,由于我们传递了sb,因此它调用了它的toString方法,从而创建了这个额外的实例。 - Pshemo
@Pshemo 是的,你说得对 :) 如果我们想要严格一点,也许还有其他由 StringBuilder 构造函数创建的内部 StringBuilder 对象。 - Bobby
我猜StringBuffer类也是一样的。 - GabrielBB

0
StringBuilder sb = new StringBuilder("abc");
sb.append("def").reverse().insert(3, "---");
System.out.println( sb );

无论使用StringBuilder类提供的哪种方法,如append、reverse等,堆中只会创建1个对象。

一旦分配了内存,即使使用toString()方法将其转换为字符串,内存也不会改变。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接