Ale*_*ndr 3 java concurrency java.util.concurrent sortedmap concurrentskiplistmap
我有一个ConcurrentSkipListMap。我需要删除低于的元素key。
这是我可以执行的方法:
private ConcurrentNavigableMap<Double, MyObject> myObjectsMap = new ConcurrentSkipListMap<>();
//...
myObjectsMap = myObjectsMap.tailMap(10.25, false);
Run Code Online (Sandbox Code Playgroud)
看起来还不错,但是我对这些事实感到困惑:
1。
返回的地图受此地图支持,因此返回的地图中的更改会反映在此地图中,反之亦然。
这是否意味着垃圾回收器不会删除旧值?
即,我们删除了旧地图,现在有了新地图。但是此新地图得到了旧地图的支持。那么,旧地图会怎样?是将其删除还是将其永久保存在内存中?
2。
尝试插入超出其范围的键时,返回的映射将抛出IllegalArgumentException。
因此,现在我不能放置小于10.25且大于最后一个最大值的新键了吗?
我很困惑。然后如何正确地需要从ConcurrentSkipListMap中删除元素?
这是否意味着垃圾回收器不会删除旧值?即,我们删除了旧地图,现在有了新地图。但是此新地图得到了旧地图的支持。那么,旧地图会怎样?是将其删除还是将其永久保存在内存中?
是的,事实上。旧地图仍然存在,并且会一直存在。
如果要删除 <10.25的键,请执行
map.headMap(10.25, false).clear();
Run Code Online (Sandbox Code Playgroud)
...这将创建该子地图,删除其所有元素-也将其从原始地图中删除-然后丢弃该子地图视图,让其被垃圾回收,并留下仅包含键的原始地图对象> = 10.25。
请注意,虽然保证删除操作开始时小于10.25的键,但是不能保证没有同时插入新键,或者以后可能会插入新键。真的,您无能为力。如果要非常确定只对map.tailMap(10.25, true)大于等于10.25的值进行操作,请继续使用,但其他小于10.25的值可能仍会插入,它们仍将保留在内存中。