字符串不变性测试

Pro*_*ist 1 java string immutability

考虑一下代码

String s="hello";
s=s.concat("java");
Run Code Online (Sandbox Code Playgroud)

由于String对象是不可变的,因此应使用S引用的值"Hello Java"创建新对象.

现在我的查询是,s先前引用的早期String对象"hello"在哪里?

它是否仍然存在于内存中?如果是的话怎么样?因为在Java中,对象的生命周期仍然存在,直到它的引用存在.在"hello"的情况下,当第二个语句执行时,它的引用已经丢失.那怎么能在内存中存在呢???

请有人解决我的疑问.:)

And*_*ner 8

它是否仍然存在于内存中?

是.该s变量不再引用它.

它将继续存在于常量池中,因为您已将其声明为字符串文字; 即使它不在常量池中,它也会继续存在,直到它被垃圾收集,这不会立即发生.

  • 你可以通过`String t ="hello"`再次访问它 (6认同)
  • @ hamena314它保持在常量池中,因为它是代码中的常量.这根本不是泄漏,除非代码包含这么多的常量,它可以用那些填充内存,它也不是问题.但是,您可以通过糟糕的日志/缓存实现来"泄漏"内存. (2认同)