我整理了一个快速测试来说明我的问题:
@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并自行管理从列表中删除元素吗?
答案 0 :(得分:1)
如果你使用的是java 8,你可以像这样编写删除代码:
list.removeIf(wr -> o2.equals(wr.get()));