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

Ale*_*nov 8 java weak-references weakhashmap

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

public class Key {}

public class Value { 
    final public Key key;
    public Value(Key k) {
        key = k;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

lag*_*lle 14

不,它不会被垃圾收集,请参阅Javadoc:

实现说明:WeakHashMap中的值对象由普通的强引用保存.因此,应该注意确保值对象不直接或间接地强烈引用它们自己的密钥,因为这将防止密钥被丢弃.

正如@biziclop所提到的,一种解决方案是在值对象中存储对密钥的弱引用.

public class Value { 
  final public WeakReference<Key> key;
  public Value(Key k) {
    this.key = new WeakReference<Key>(k);
  }
}
Run Code Online (Sandbox Code Playgroud)