我在Daniel Liang的最新一本关于Java编程的书中看到了以下文本(第386页,第10版):
以下代码是否会更改字符串的内容?
String s = "Java"; s = "HTML";
答案是否定的。 .... 第一个String对象在赋值后仍然存在,但无法再访问它,因为变量s现在指向新对象,如图10.15所示。
基于上述文本,似乎作者认为字符串对象“Java”不是垃圾收集的,即使它不再被引用。我知道Java中的实习字符串的存储位置发生了一些变化。请记住,上面的书正在处理Java SE 8.
但根据Java垃圾收集器,未使用的对象(不再引用的对象)会自动进行垃圾回收。
那么Java SE 8的实际案例是哪种情况?
答案 0 :(得分:1)
字符串文字是实习字符串,但并非所有实习字符串都是字符串文字。
字符串文字由定义它们的类保持活动,而这些类又由实例和类加载器保持活动状态。您需要卸载类才有资格获得GC。
另一方面,实习字符串仅保证string1.equals(string2)
然后string1.intern() == string2.intern()
。这个特定的定义允许对嵌入的字符串进行垃圾收集,因为oldInternedString != newInternedString
是不可观察的,因为如果它被垃圾收集,就不能引用oldInternedString
。所以字符串实习表可以(但不是必需的)实现为弱引用表,这允许它们被GCed。
答案 1 :(得分:0)
作者的观点与垃圾收集并没有多大关系。在将来的某个时刻对象将被垃圾收集的事实与在赋值之后它仍然存在的断言相矛盾。他并不是说它将永远存在,只是因为作业不会改变原始对象。