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

How to remove elements to key in ConcurrentSkipListMap?

我有一个ConcurrentSkipListMap。我需要删除低于 key.

的元素

以下是我的执行方法:

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

//...

myObjectsMap = myObjectsMap.tailMap(10.25, false);

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

1.

The returned map is backed by this map, so changes in the returned map are reflected in this map, and vice-versa.

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

2.

The returned map will throw an IllegalArgumentException on an attempt to insert a key outside its range.

那么,现在我不能放置小于 10.25 和大于上一个最大值的新密钥吗?

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

Does it mean that old values won't be removed by the garbage collector? I.e. we removed the old map and now we have a new map. But this new map is backed by the old map. So, what happens with the old map? Will it be removed or will it be sitting on a memory forever?

是的,事实上。旧地图还在,而且会一直在。

如果你想删除 keys < 10.25,那么

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

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

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