在这种情况下会收集对象吗?

时间:2014-04-26 09:14:03

标签: java weak-references

我们说我有一个看起来像这样的参考树:

root => WeakHashMap<View, Binder> => Binder => View
// by WeakHashMap I mean keys (Views) are referenced by WeakReferences
// View is only referenced by Binder

会收集View(和Binder)吗?或者从BinderView的引用也必须是弱的吗?

它在代码中的外观如何:

class SomeClass {
    private static final Map<View, Binder> binders = new WeakIdentityHashMap<>();
    // (...)
}

class Binder {
    private final View target;

    public Binder(View target) {
        this.target = target
    }
    // (...)
}

1 个答案:

答案 0 :(得分:2)

没有

http://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html

  

实施说明:WeakHashMap中的值对象由。持有   普通的强引用。因此,应该注意确保这一点   值对象不直接强烈引用自己的键   或间接地,因为这将防止密钥被丢弃。   请注意,值对象可以通过以下方式间接引用其键   WeakHashMap本身;也就是说,值对象可能强烈引用一些   其他关键对象,其关联的值对象反过来强烈   指第一个值对象的键。如果是地图中的值   一种方法,不要依赖地图持有强有力的参考   处理这个问题就是将值本身包装在WeakReferences中   在插入之前,如:m.put(key,new WeakReference(value)),和   然后解开每一个。

WeakReference从value到key:

是。

http://docs.oracle.com/javase/7/docs/api/java/lang/ref/package-summary.html#reachability

  

如果一个对象既不强也不柔和,则它是弱可达的   可以到达,但可以通过遍历弱引用来达到。当。。。的时候   对象是一个弱可达对象的弱引用   有资格完成定稿。