从 WeakReference 列表中删除对象

Remove object from list of WeakReference

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

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

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

我知道 this answer 这个问题,它建议遍历列表以识别元素。由于删除操作将被相当频繁地调用,这似乎不是最佳选择(操作是 O(N))。

是否有更好的替代方法来删除元素?或者我应该放弃使用 Wea​​kReference 并自己管理从列表中删除元素?

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

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