【发布时间】:2016-02-05 17:37:12
【问题描述】:
在这段代码中,我声明了一个 Initialized a String 变量,然后打印了它的哈希码,然后将其重新初始化为另一个值,然后调用垃圾收集器来清除取消引用的对象。
但是当我将 String 变量重新初始化为其原始值并打印哈希码时,会打印相同的哈希码。怎么样?
public class TestGarbage1 {
public static void main(String args[]) {
String m = "JAVA";
System.out.println(m.hashCode());
m = "java";
System.gc();
System.out.println(m.hashCode());
m = "JAVA";
System.out.println(m.hashCode());
}
}
【问题讨论】:
-
虽然一个对象的哈希码是从它的内存地址派生的,但字符串的哈希码是从它的值派生的。
-
尽管有@Elogent 的评论,您已经要求 GC,但不一定运行。
-
即使在你调用
System.gc()的那一行立即发生了GC,m仍然指向"JAVA",因此不会收集该实例。 -
请注意,您使用的常量字符串是类常量池的一部分,不会被垃圾回收。通过调用
new String(...)创建的字符串可能会有不同的处理方式,但它仍然取决于 JVM 实现。