如何在ConcurrentSkipListMap中删除要键入的元素?

时间:2017-09-20 18:51:46

标签: java concurrency java.util.concurrent sortedmap concurrentskiplistmap

我有ConcurrentSkipListMap。我需要删除低于key的元素。

以下是我可以执行的方式:

private ConcurrentNavigableMap<Double, MyObject> myObjectsMap = new ConcurrentSkipListMap<>();

//...

myObjectsMap = myObjectsMap.tailMap(10.25, false);

看起来不错,但我对这些事实感到困惑:

1

  

返回的地图由此地图支持,因此更改了返回的地图   反映在这张地图上,反之亦然。

是否意味着垃圾收集器不会删除旧值? 即我们删除了旧地图,现在我们有了一张新地图。但这张新地图由旧地图支持。那么,旧地图会发生什么?它会被移除还是会永远存在于记忆中?

2

  

返回的地图会在尝试时抛出IllegalArgumentException   在其范围之外插入一个键。

那么,现在我无法设置小于10.25且超过最后一个最大值的新密钥?

我很困惑。那么如何正确地我需要从ConcurrentSkipListMap中删除元素?

1 个答案:

答案 0 :(得分:5)

  

是否意味着垃圾收集器不会删除旧值?   即我们删除了旧地图,现在我们有了一张新地图。但这张新地图由旧地图支持。那么,旧地图会发生什么?它会被移除还是会永远存在于记忆中?

是的,事实上。旧地图仍然存在,它会一直存在。

如果您想删除键&lt; 10.25,然后做

map.headMap(10.25, false).clear();

...将创建该子地图,删除其所有元素 - 从原始地图中删除它们 - 然后丢弃该子地图视图,让它被垃圾收集并留下原始地图对象只包含键&gt; = 10.25。

请注意,虽然这可以保证删除&lt; 10.25当操作开始时,不能保证没有同时插入新密钥,或者以后可能插入新密钥。真的,你无能为力。如果你想确定你只是在值> = 10.25的情况下操作,那么继续使用map.tailMap(10.25, true),但是其他小于10.25的值可能仍会被插入,并且它们仍然会在内存中