У меня есть HashMap
, где ключи являются непостоянными сложными объектами - хэш-изменения меняются в течение срока их службы.Я точно знаю, какие объекты изменены, но только по факту - их удаление с помощью map.remove(object)
не сработает, потому что хеш изменился.Количество объектов на карте примерно в диапазоне [10, 10 000], проблема скорее в количестве изменений и обращений.
Было бы требовательным сделать проверку «вы измените» для каждого объектаперед изменением - удвойте работу, не говоря уже о беспорядке кода, необходимого для этого.
Позже я делаю итерации записей на карте, поэтому я решил, что могу просто пометить объекты для удаления и избавиться от них.они используют iterator.remove()
, но, к сожалению, HashMap$HashIterator#remove
вызывает hash(key)
.
Один вариант, который мне приходит в голову, это выбросить оригинальную карту и перефразировать все объекты, которые не отмечены для удаления, в новыйкарта, но это создаст много дополнительного времени и мусора в памяти - хотелось бы избежать этого.
Другой вариант - написать мой собственный HashMap, который отслеживает, где именно хранится каждый элемент (скажем, карта, образованнаяМассив двухмерных объектов = две координаты типа int).Это было бы более эффективно, но и намного больше для написания и тестирования.
Есть ли более простой способ сделать это, что я пропустил?
Редактировать:
Я использую обертки над сложным объектом, которые предоставляют разные пары хэш / равно в зависимости от подмножества свойств.Каждый объект может быть в нескольких картах.Скажем, я ищу красный объект на карте, который использует обертки с хешем / равнозначными по цвету, создает красный фиктивный объект и выполняет map.get (пустышка).
Реализации hash / equals и конкретных свойств, к которым они относятся, не являются частью моего кода.
Все карты являются объектами, отображаемыми на себя (как и реализация Set, но мне нужны методы доступа к карте).Я могу хранить хэши в этих оболочках, и тогда они будут придерживаться контракта с точки зрения хэширования, но equals все равно меня подведет.
Я понимаю, что при изменении результата hash / equals получается неопределенное поведение, но это действительноне должно иметь значения в теории - я меняю объект, и тогда я не хочу использовать карту, пока измененный объект не исчезнет из нее.Хеш-карта на самом деле не должна вызывать equals () или hash () для объекта, на который она уже указывает с помощью итератора.