Как удалить элементы для ключа в 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 могут все еще вставляться, и они все еще будут в памяти.

Другие вопросы по тегам