从WeakReference列表中删除对象

时间:2015-12-13 07:57:24

标签: java weak-references

我整理了一个快速测试来说明我的问题:

@Test
public void testRemovalFromWakLinkedList() {
    Object o1 = new Object();
    Object o2 = new Object();
    assertFalse(o1.equals(o2));

    ArrayList<WeakReference<Object>> list = new ArrayList<>();
    assertTrue(list.isEmpty());

    final WeakReference<Object> wo1 = new WeakReference<>(o1);
    list.add(wo1);
    final WeakReference<Object> wo2 = new WeakReference<>(o2);
    list.add(wo2);
    assertEquals(2, list.size());

    final WeakReference<Object> wo2_2 = new WeakReference<>(o2);
    list.remove(wo2_2);
    assertFalse(wo2.equals(wo2_2));
    assertEquals(1, list.size());
}

最后一个断言失败,因为同一个对象的WeakReference的两个实例不一样。因此,无法从列表中删除元素。

我知道问题this answer,建议迭代列表以识别元素。由于删除操作会被频繁调用,这似乎不是最佳选择(操作是O(N))。

有没有更好的替代方法来删除元素?或者我应该放弃使用WeakReference并自行管理从列表中删除元素吗?

1 个答案:

答案 0 :(得分:1)

如果你使用的是java 8,你可以像这样编写删除代码:

list.removeIf(wr -> o2.equals(wr.get()));