示例代码:
StringBuffer sb = new StringBuffer("hi");
sb = null;
问题:
当StringBuffer被垃圾回收后,字面字符串“hi”是否会在内存中保留?还是仅用于为StringBuffer创建字符数组,然后不再放置在内存中?
示例代码:
StringBuffer sb = new StringBuffer("hi");
sb = null;
问题:
当StringBuffer被垃圾回收后,字面字符串“hi”是否会在内存中保留?还是仅用于为StringBuffer创建字符数组,然后不再放置在内存中?
是的,hi
是一个编译时常量,因此它将由编译器放入字符串池中。
此外,G1GC可以作为JEP 192:G1中的字符串去重 的一部分执行字符串去重。在这种情况下,即使hi
没有被javac
放入池中,它也可能作为去重的一部分被保留。
String
类的实例。这是因为字符串字面值 - 或者更一般地说,是常量表达式的值(§15.28) - 被“interned”以共享唯一实例,使用 String.intern
方法。
StringBuilder
而不是StringBuffer
。至于字面量String
,则取决于您使用的 Java 版本以及它是否在intern
池中。 - Elliott FrischStringBuilder
。毕竟,你必须为其中一个做出决定。 - HolgerStringBuffer
会复制传递给它构造函数的参数,但不持有任何对它的引用,因此,它是否被垃圾回收与"hi"
字符串实例的生命周期完全无关。 - Holger