2014-03-07 19 views
0

我一直在经历the following tutorial,我碰到这个代码就来了:新到Java - 新的String()和关系WeakHashMap中

map.put(new String("Maine"), "Augusta"); 

只是为了试验,我把它改为:

String hold = "Maine"; 
map.put(hold, "Augusta"); 

因此,循环会永远持续下去,这意味着此对象不会因为它应该收集垃圾,因为我们正在使用WeakHashMap。我不知道这是为什么。是什么使得在这种情况下新的String()与String不同?

也..还有一个问题 - 为什么这个地图必须是静态的或否则containsKeys会给出错误?

回答

2

正如你发布的链接解释说:

允许键值对被garbagecollected 当它的关键是没有 在第一WeakHashMap的外部不再引用

所以例如,"Maine"字符串没有被任何外部引用,所以它最终会被垃圾回收(当GC运行时)。在第二个示例中,它是从WeakHashMap(由hold)之外引用的,因此它不会被垃圾收集。

+0

明白了,谢谢,怎么还有一个问题 - 为什么这个映射必须是静态的,否则containsKey会给出错误? – user3134565

+0

@ m0skit0是完全正确的,你应该说''缅因州''是_eventually_垃圾收集。不一定是这种情况马上就会发生。它甚至可能不会发生。 – gexicide

+0

@gexicide当GC运行时,它会在垃圾收集时发生。让我们尽量不要太迂腐;) – m0skit0

0

当你声明String保持时,你正在做一个强引用,这意味着“Maine”不应该被垃圾收集,因为weakmap之外的一些变量引用了String。

在最初的例子中,对“缅因州”的唯一引用是在弱映射中,所以这个引用被称为“弱”。然后变量被垃圾收集

+0

明白了,谢谢,怎么还有一个问题 - 为什么这张地图必须是静态的,否则containsKeys会给出错误? – user3134565

+0

由于您在静态方法中执行代码,因此无法访问非静态对象,如果您希望它是非静态的,则应该创建一个WeakHashMap的新实体。并通过这个新对象访问地图。 –