Как TreeSet, HashSet или LinkedHashSet ведут себя, когда объекты изменчивы? Я не могу себе представить, что они будут работать в любом смысле?
Если я изменю объект после того, как добавлю его; Каково поведение списка?
Есть ли лучший вариант для работы с коллекцией изменчивых объектов (которые мне нужно отсортировать / индексировать / и т. д.), кроме связанного списка или массива, и просто повторять их каждый раз ?
Интерфейс Set
решает эту проблему напрямую: «Примечание. Следует проявлять большую осторожность, если изменяемые объекты используются в качестве элементов набора. Поведение набора не указывается, если значение объекта изменяется. таким образом, который влияет на сравнение равенства, в то время как объект является элементом в наборе. Особый случай этого запрета состоит в том, что набору не разрешено содержать себя в качестве элемента».
Приложение:
Есть ли лучший вариант для работы с набором изменяемых объектов?
При попытке решить, какая реализация коллекции является наиболее подходящей, возможно, стоит изучить основные интерфейсы коллекции . В частности, для реализаций Set
, если equals()
и hashCode()
реализованы правильно, любые несвязанные атрибуты могут быть изменяемыми. По аналогии с отношением к базе данных может измениться любой атрибут, но первичный ключ должен оставаться неприкосновенным.
Изменчивость является проблемой для коллекции только в том случае, если хэш-код объектов и поведение методов сравнения изменяются после их вставки.
С этим можно справиться, удалив объекты из коллекции и повторно добавив их после такого изменения, чтобы объект.
По сути, это приводит к неизменному объекту с точки зрения коллекций.
Другим менее эффективным способом может быть сохранение набора, содержащего все объекты, и создание TreeSet/HashSet, когда вам нужно отсортировать или проиндексировать набор. Это не реальное решение для ситуации, когда объекты постоянно меняются, и в то же время вам нужен доступ к карте.
«Лучший» способ справиться с этой ситуацией — сохранить вспомогательные структуры данных для поиска, немного похожие на индексы в базе данных. Затем все ваши модификации должны убедиться, что индексы обновлены. Хорошими примерами могут быть карты или мультикарты — перед обновлением удалите запись из любых индексов, а затем после обновления добавьте их обратно с новыми значениями. Очевидно, что это требует осторожности с параллелизмом и т. д.