4

我有一个ConcurrentSkipListMap. 我需要删除低于 then 的元素key

这是我如何执行它:

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

//...

myObjectsMap = myObjectsMap.tailMap(10.25, false);

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

1.

返回的地图由此地图支持,因此返回地图中的更改会反映在此地图中,反之亦然。

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

2.

返回的映射将在尝试在其范围之外插入键时抛出 IllegalArgumentException。

那么,现在我不能放置小于 10.25 且大于上一个最大值的新键?

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

4

1 回答 1

6

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

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

如果要删除< 10.25 的键,请执行

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

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

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

于 2017-09-20T18:57:41.350 回答