Java中修改字符串引用后,字符串常量池中的旧字符串会被移除吗?
关于Java字符串常量池中旧字符串的保留问题
先纠正你示例代码里的拼写错误,正确代码应该是:
String s1 = "hello"; s1 = "test";
结论很明确:字符串常量池中的"hello"不会被移除,原因如下:
- 字符串常量池的核心作用是缓存字符串字面量,实现对象复用。一旦像
"hello"这种字符串字面量被JVM加载到常量池中,常量池本身会持有该对象的引用,只要JVM没有退出,或者该字面量所属的类没有被卸载(这种场景非常少见),这个字符串就会一直留在常量池里。 - 你提到的变量
s1指向新对象,只是改变了变量的引用关系,并不会影响常量池里原字符串的引用状态。常量池对"hello"的引用依然存在,所以它不会被垃圾回收(GC)清理掉。
补充一点:如果是通过new String("hello")创建的堆对象,当没有引用指向它时会被GC回收,但常量池里的"hello"字面量依然会保留。
内容的提问来源于stack exchange,提问作者Limbarunda
相关产品推荐
相关产品推荐

