我对HashMaps感到困惑。如果我有一个HashMap,请说HashMap。然后我像这样添加键和值到HashMap
HashMap.put(1,myObj1);
HashMap.put(2,myObj2);
HashMap.put(3,myObj3);
现在,如果我执行myObj1 = null,那么HashMap中的值仍然可用我相信的原因(纠正我如果我错了)myObj1只包含指向内存中位置的指针(引用)。所以在HashMap中复制了myObj1的引用。由于myObj1现在指向无处(null),但hashMap中复制的值仍然指向内存位置。所以现在这个弱,强的是什么样的参考。将myObj1垃圾收集起来,如果它指向的值(值hasHashMap仍然指向),会发生什么。
答案 0 :(得分:2)
如果没有引用指向,任何对象都只能被垃圾收集。
如果您执行以下操作:
Object myObj1 = ....
myMap.put(1,myObj1);
myObj1 = null;
您拥有从myMap
到myObj1
的内部参考。
如果没有其他引用(显式或隐式)存在myMap
,则将引用保留为myObj1
时,它将成为垃圾回收的候选者。
因此,如果您明确地设置为null,则myMap
myObj
的引用将成为gc的候选者。
Object myObj1 = ....
myMap.put(1,myObj1);
myObj1 = null; // myObj1 is not candidate to be gc
...
myMap = null; // myObj1 and myMap are candidates to be gc
答案 1 :(得分:1)
HashMap实现中的值始终具有强引用。这意味着什么,除非你删除元素/地图,否则它将被垃圾收集。在Java中有另一个名为WeakHashMap的实现,它将密钥存储为弱引用。无论是否从Map中删除,此密钥都将被垃圾收集。请注意WeakHashMap中的值仍然具有强大的参考价值。