我需要将一些数据与密钥关联一段时间,因此我使用的是WeakHashMap
。但是,另外我需要通过其相应的值获取密钥。简单的方法是在创建值时保持引用:
public class Key {}
public class Value {
final public Key key;
public Value(Key k) {
key = k;
}
}
当然,当我在我的程序中使用Value
时,其key
将不会消失。但是,如果在地图外没有对任何一个键或其值的引用,它是否会被垃圾收集?或者价值中幸存的强大参考会阻止它吗?
答案 0 :(得分:14)
不会收集垃圾,请参阅Javadoc:
实现说明:WeakHashMap中的值对象由普通的强引用保存。因此,应该注意确保值对象不直接或间接地强烈引用它们自己的键,因为这样可以防止键被丢弃。
正如@biziclop所提到的,一个解决方案是在您的值对象中存储对该键的弱引用。
public class Value {
final public WeakReference<Key> key;
public Value(Key k) {
this.key = new WeakReference<Key>(k);
}
}
答案 1 :(得分:2)
看看实施情况,答案似乎是否定。
这来自WeakHashMap
来源:
/**
* The table, resized as necessary. Length MUST Always be a power of two.
*/
private Entry[] table;
...
private static class Entry<K,V> extends WeakReference<K> implements Map.Entry<K,V> {
private V value;
...
}
如您所见,地图本身强烈引用了Entry
个对象。因此,如果地图可以访问,那么Entry
也是Value
对象,也是您的密钥。