Как удалить элементы для ключа в ConcurrentSkipListMap?
У меня есть ConcurrentSkipListMap
, Мне нужно удалить элементы ниже key
,
Вот как я могу это сделать:
private ConcurrentNavigableMap<Double, MyObject> myObjectsMap = new ConcurrentSkipListMap<>();
//...
myObjectsMap = myObjectsMap.tailMap(10.25, false);
Выглядит хорошо, но я запутался в этих фактах:
1.
Возвращенная карта поддерживается этой картой, поэтому изменения в возвращенной карте отражаются на этой карте, и наоборот.
Означает ли это, что старые значения не будут удалены сборщиком мусора?
Т.е. мы удалили старую карту и теперь у нас есть новая карта. Но эта новая карта поддерживается старой картой. Итак, что происходит со старой картой? Будет ли он удален или навсегда останется в памяти?
2.
Возвращенная карта вызовет исключение IllegalArgumentException при попытке вставить ключ за пределы его диапазона.
Итак, теперь я не могу поставить новые ключи, которые меньше 10,25 и больше, чем последнее максимальное значение?
Я сбит с толку. Как тогда правильно мне нужно удалить элементы из ConcurrentSkipListMap?
1 ответ
Означает ли это, что старые значения не будут удалены сборщиком мусора? Т.е. мы удалили старую карту и теперь у нас есть новая карта. Но эта новая карта поддерживается старой картой. Итак, что происходит со старой картой? Будет ли он удален или навсегда останется в памяти?
Да, по сути. Старая карта все еще вокруг, и она останется вокруг.
Если вы хотите удалить ключи < 10.25, то выполните
map.headMap(10.25, false).clear();
... который создаст эту подкарту, удалит все ее элементы - удалив их и с исходной карты - и затем откажется от этого представления подкарты, позволив ему собрать мусор и оставив вас с исходным объектом карты, содержащим только ключи >= 10,25.
Напоминаем, что при этом гарантированно удаляются ключи, которые были <10,25 на момент начала операции, нет никаких гарантий, что новые ключи не были одновременно вставлены или что новые ключи могут быть вставлены позже. Вы ничего не можете с этим поделать, правда. Если вы хотите быть уверены, что работаете только со значениями>= 10,25, тогда используйте map.tailMap(10.25, true)
, но другие значения меньше 10.25 могут все еще вставляться, и они все еще будут в памяти.