【问题标题】:Remove object from list of WeakReference从 WeakReference 列表中删除对象
【发布时间】: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))。

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

【问题讨论】:

    标签: java weak-references


    【解决方案1】:

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

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

    【讨论】:

    • documentation 我收集到,实现是由迭代器支持的,所以性能仍然是 O(N)。但这比自己遍历列表要干净。
    • 另一个区别是 removeIf() 删除所有匹配的实例,而 remove() 只删除第一个匹配项。
    • remove() 的性能也是 O(N) - 除了像 Set 这样的特殊集合。
    猜你喜欢
    • 2021-08-03
    • 2020-04-17
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 2019-01-25
    相关资源
    最近更新 更多