java - 是否要从字符串池中删除旧字符串?
问题描述
我见过几个类似的问题,但他们的回答并没有真正回答我的问题。
当我们编辑字符串并创建一个新字符串时,旧字符串会去哪里。
String s1 = "Hello"
s1 += "World"
我们有一个字符串 Hello,但随后创建了一个新字符串,它是 HelloWorld。
字符串 Hello 是否仍在字符串池中(我猜不是,因为我们失去了对它的引用)。垃圾收集器会摧毁它吗?
如果我们创建一个新字符串并使用 intern 方法会怎样。这个字符串会从池中取出吗?
String s1 = "Hello";
s1 += "World";
String s2 = "Hello";
在这个话题中,斯蒂芬 C 说
如果字符串变得无法访问,它们将被垃圾收集
但我做了这样的事情:
String s1 = "Hello";
System.out.println(System.identityHashCode(s1));
s1 += "World";
System.gc();
String s2 = "Hello";
System.out.println(System.identityHashCode(s2));
它打印了相同的身份哈希码,尽管我丢失了对“Hello”字符串的引用,并且一个新的应该打印了另一个身份哈希码。
他还说
这意味着只要可以执行该方法,该字符串就可以访问。
但是我做了一个与上面类似的实验,其中该方法创建了一个字符串,然后在另一种方法中,我创建了相同的字符串(在使用 System.gc 之前)并打印出相同的身份哈希码。
如果我失去对它们的引用,为什么 GC 不会在我的 2 个案例中销毁字符串?
解决方案
推荐阅读
- excel - 如何从 Excel 序列号中提取年份
- node.js - 无法通过 NPM 全局安装 FIREBASE(错误 127)
- reactjs - Azure CDN + Cloudflare 结构上的缓存问题
- c# - Blazor 如何让 Blazor 组件不重新加载/重新渲染
- python - scikit-learn 安装:错误:命令出错,退出状态为 1:
- c++ - 如何使用循环 (C++) 从函数中的文件中逐行读取空格、单词和字母
- json - Postgresql json 字段具有 YYYY-MM-DD 和 13 位 unix 时间戳格式的日期
- python - 如何使上次启动的窗口全屏显示
- ios - 使用 Apple 登录 GitHub Pages 上托管的 react.js 应用程序
- java - 如何跟踪已打印的数组元素并跳过它们(Java)