如果值包含对密钥的唯一强引用,是否会收集WeakHashMap的条目?

时间:2011-11-08 14:28:02

标签: java weak-references weakhashmap

我需要将一些数据与密钥关联一段时间,因此我使用的是WeakHashMap。但是,另外我需要通过其相应的值获取密钥。简单的方法是在创建值时保持引用:

public class Key {}

public class Value { 
    final public Key key;
    public Value(Key k) {
        key = k;
    }
}

当然,当我在我的程序中使用Value时,其key将不会消失。但是,如果在地图外没有对任何一个键或其值的引用,它是否会被垃圾收集?或者价值中幸存的强大参考会阻止它吗?

2 个答案:

答案 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对象,也是您的密钥。