在内存中使用字面量字符串的StringBuilder/StringBuffer

6

示例代码:

StringBuffer sb = new StringBuffer("hi");
sb = null;

问题:

当StringBuffer被垃圾回收后,字面字符串“hi”是否会在内存中保留?还是仅用于为StringBuffer创建字符数组,然后不再放置在内存中?


1
建议使用 StringBuilder 而不是 StringBuffer。至于字面量 String,则取决于您使用的 Java 版本以及它是否在 intern 池中。 - Elliott Frisch
似乎字符串字面量被放入字符串池中,并且在程序运行期间一直保留在内存中。 - Artanis
@ElliottFrisch 我认为你需要回到很久以前才能找到没有被内部化的字符串字面量。 - Tom Hawtin - tackline
1
@OleV.V. 嗯,等待优化器删除不必要的操作和一开始就不请求该操作之间存在差异。因此,无论差异有多小,由于没有其他功能差异,仍然有理由更喜欢 StringBuilder。毕竟,你必须为其中一个做出决定。 - Holger
1
StringBuffer 会复制传递给它构造函数的参数,但不持有任何对它的引用,因此,它是否被垃圾回收与 "hi" 字符串实例的生命周期完全无关。 - Holger
显示剩余2条评论
2个回答

10

是的,hi是一个编译时常量,因此它将由编译器放入字符串池中。

此外,G1GC可以作为JEP 192:G1中的字符串去重 的一部分执行字符串去重。在这种情况下,即使hi没有被javac放入池中,它也可能作为去重的一部分被保留。


4

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