如何从列表中删除weakReference?

Adi*_*be7 8 java weak-references list

我在java中有一个对象的弱引用列表.我如何编写一个获取真实对象实例的方法并从该列表中删除它的弱引用?

谢谢.

Jon*_*eet 36

你的意思并不完全清楚,但我认为你可能想要:

public static <T> void removeReference(List<WeakReference<T>> list,
                                       T reference)
{
    for (Iterator<WeakReference<T>> iterator = list.iterator();
         iterator.hasNext(); )
    {
        WeakReference<T> weakRef = iterator.next();
        if (weakRef.get() == reference)
        {
            iterator.remove();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你也可以删除那些无效的弱点 (7认同)

Dil*_*nga 6

看看WeakReference的Javadocs .需要注意两个重要的事项:1.它是受保护的,所以你可以扩展它,2.它不会覆盖Object.equals()

那么,有两种方法可以做你想做的事情:

首先,简单的方法,使用@Jon Skeet所说的.

第二,更优雅的方式.注意:这仅适用于您是唯一添加到列表中的人:

public class HardReference<T> {
  private final T _object;

  public HardReference(T object) {
    assert object != null;
    _object = object;
  }

  public T get() { return _object; }

  public int hashCode() { return _object.hashCode(); }

  public boolean equals(Object other) {
    if (other instanceof HardReference) {
      return get() == ((HardReference) other).get();
    }
    if (other instanceof Reference) {
      return get() == ((Reference) other).get();
    }
    return get() == other;
  }
}

class WeakRefWithEquals<T> extends WeakReference<T> {

  WeakRefWithEquals(T object) { super(object); }

  public boolean equals(Object other) {
    if (other instanceof HardReference) {
      return get() == ((HardReference) other).get();
    }
    if (other instanceof Reference) {
      return get() == ((Reference) other).get();
    }
    return get() == other;
  }
}
Run Code Online (Sandbox Code Playgroud)

一旦有了这些实用程序类,就可以使用任何引用子类包装存储在Lists,Maps等中的对象 - 就像上面的WeakRefWithEquals示例一样.在查找元素时,需要将其包装为HardReference,以防集合实现

param.equals(element)
Run Code Online (Sandbox Code Playgroud)

代替

element.equals(param)
Run Code Online (Sandbox Code Playgroud)