如何从列表中删除weakReference?

时间:2011-06-09 16:19:28

标签: java list weak-references

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

感谢。

2 个答案:

答案 0 :(得分:35)

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

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();
        }
    }
}

答案 1 :(得分:6)

查看WeakReference的Javadoc。需要注意的两件重要事项:  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;
  }
}

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

param.equals(element)

而不是

element.equals(param)