我有一个 ConcurrentSkipListMap
。我需要删除比key
较低的元素。
这是我可以执行的方式:
private ConcurrentNavigableMap<Double, MyObject> myObjectsMap = new ConcurrentSkipListMap<>();
//...
myObjectsMap = myObjectsMap.tailMap(10.25, false);
看起来还不错,但是我对这些事实感到困惑:
1。
返回的地图由此地图支持,因此在返回的地图中更改 反映在此地图中,反之亦然。
这是否意味着垃圾收集器不会删除旧值?
IE。我们删除了旧地图,现在有了新的地图。但是这张新地图由旧地图提供支持。那么,旧地图会发生什么?它会被删除还是永远坐在记忆中?
2。
返回的地图将尝试尝试 插入范围之外的钥匙。
所以,现在我不能放置小于10.25且超过最后一个最大值的新键?
我很困惑。那么我如何正确地需要从concurrentskiplistmap中删除元素?
这是否意味着垃圾收集器不会删除旧值? IE。我们删除了旧地图,现在有了新的地图。但是这张新地图由旧地图提供支持。那么,旧地图会发生什么?它会被删除还是永远坐在记忆中?
是的,实际上。旧地图仍在附近,它将留在周围。
如果要删除键&lt;10.25,然后做
map.headMap(10.25, false).clear();
...它将创建该子图,删除其所有元素 - 也将其从原始地图中删除 - 然后丢弃该子束视图,让其收集垃圾,然后将您与原始地图对象保持仅包含键> = 10.25。
请注意,虽然可以保证删除&lt的密钥;10.25当操作开始时,无法保证没有同时插入新密钥,或者以后可能会插入新密钥。实际上,您无能为力。如果您想非常确定自己仅在值> = 10.25上运行,那么继续使用map.tailMap(10.25, true)
,但是其他小于10.25的值仍可能被插入,并且它们仍然会在内存中。