【发布时间】:2015-12-13 07:57:24
【问题描述】:
我整理了一个快速测试来说明我的问题:
@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 并自己管理从列表中删除元素?
【问题讨论】:
标签: java weak-references