我有ConcurrentSkipListMap
。我需要删除低于key
的元素。
以下是我可以执行的方式:
private ConcurrentNavigableMap<Double, MyObject> myObjectsMap = new ConcurrentSkipListMap<>();
//...
myObjectsMap = myObjectsMap.tailMap(10.25, false);
看起来不错,但我对这些事实感到困惑:
1
返回的地图由此地图支持,因此更改了返回的地图 反映在这张地图上,反之亦然。
是否意味着垃圾收集器不会删除旧值? 即我们删除了旧地图,现在我们有了一张新地图。但这张新地图由旧地图支持。那么,旧地图会发生什么?它会被移除还是会永远存在于记忆中?
2
返回的地图会在尝试时抛出IllegalArgumentException 在其范围之外插入一个键。
那么,现在我无法设置小于10.25且超过最后一个最大值的新密钥?
我很困惑。那么如何正确地我需要从ConcurrentSkipListMap中删除元素?答案 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的值可能仍会被插入,并且它们仍然会在内存中