java新手-new String()和weakHashMap之间的关系

java新手-new String()和weakHashMap之间的关系,java,Java,我一直在经历,我遇到了以下代码: map.put(new String("Maine"), "Augusta"); 为了试验,我将其更改为: String hold = "Maine"; map.put(hold, "Augusta"); 因此,循环将永远持续下去,这意味着该对象不会得到它应该得到的垃圾收集,因为我们使用的是WeakHashMap。我不知道这是为什么。在这种情况下,是什么使new String()与String hold不同 还有。。还有一个问题-为什么此地图必须是静态的,否

我一直在经历,我遇到了以下代码:

map.put(new String("Maine"), "Augusta");
为了试验,我将其更改为:

String hold = "Maine";
map.put(hold, "Augusta");
因此,循环将永远持续下去,这意味着该对象不会得到它应该得到的垃圾收集,因为我们使用的是WeakHashMap。我不知道这是为什么。在这种情况下,是什么使new String()与String hold不同


还有。。还有一个问题-为什么此地图必须是静态的,否则ContaineKeys会给出错误?

如您发布的链接所述:

允许在键值对为“否”时收集该键值对 在WeakHashMap之外引用的时间更长


所以在第一个示例中,
“Maine”
字符串没有被任何东西外部引用,所以它最终将被垃圾收集(当GC运行时)。在第二个示例中,它是从
WeakHashMap
(通过
hold
)外部引用的,因此它不是垃圾收集的。

当您声明字符串hold时,您正在进行强引用,这意味着“Maine”不应该被垃圾收集,因为weakmap外部的某个变量引用了该字符串


在最初的示例中,对“缅因州”的唯一引用是在weakmap中,因此该引用称为“弱”。然后对变量进行垃圾收集

明白了,谢谢,还有一个问题-为什么这个映射必须是静态的,否则containKeys会给出错误?@m0skit0要完全正确,你应该说
“Maine”
最终是垃圾收集的。这种情况不一定会立即发生。它甚至可能根本不会发生。@gexicide它将在GC运行时发生,也就是在垃圾收集时发生。让我们尽量不要太迂腐;)明白了,谢谢,还有一个问题-为什么这个映射必须是静态的,否则containKeys会给出错误?因为您是在静态方法中执行代码的,所以无法访问非静态对象,如果您希望它是非静态的,您应该创建一个新的WeakHashMap实体。并通过这个新对象访问地图。