Коллекции Java с изменяемыми объектами

Как TreeSet, HashSet или LinkedHashSet ведут себя, когда объекты изменчивы? Я не могу себе представить, что они будут работать в любом смысле?

Если я изменю объект после того, как добавлю его; Каково поведение списка?

Есть ли лучший вариант для работы с коллекцией изменчивых объектов (которые мне нужно отсортировать / индексировать / и т. д.), кроме связанного списка или массива, и просто повторять их каждый раз ?

9
задан laurencer 28 August 2010 в 19:19
поделиться

3 ответа

Интерфейс Set решает эту проблему напрямую: «Примечание. Следует проявлять большую осторожность, если изменяемые объекты используются в качестве элементов набора. Поведение набора не указывается, если значение объекта изменяется. таким образом, который влияет на сравнение равенства, в то время как объект является элементом в наборе. Особый случай этого запрета состоит в том, что набору не разрешено содержать себя в качестве элемента».

Приложение:

Есть ли лучший вариант для работы с набором изменяемых объектов?

При попытке решить, какая реализация коллекции является наиболее подходящей, возможно, стоит изучить основные интерфейсы коллекции . В частности, для реализаций Set , если equals() и hashCode() реализованы правильно, любые несвязанные атрибуты могут быть изменяемыми. По аналогии с отношением к базе данных может измениться любой атрибут, но первичный ключ должен оставаться неприкосновенным.

4
ответ дан 3 November 2019 в 05:33
поделиться

Изменчивость является проблемой для коллекции только в том случае, если хэш-код объектов и поведение методов сравнения изменяются после их вставки.

С этим можно справиться, удалив объекты из коллекции и повторно добавив их после такого изменения, чтобы объект.

По сути, это приводит к неизменному объекту с точки зрения коллекций.

Другим менее эффективным способом может быть сохранение набора, содержащего все объекты, и создание TreeSet/HashSet, когда вам нужно отсортировать или проиндексировать набор. Это не реальное решение для ситуации, когда объекты постоянно меняются, и в то же время вам нужен доступ к карте.

2
ответ дан 3 November 2019 в 05:33
поделиться

«Лучший» способ справиться с этой ситуацией — сохранить вспомогательные структуры данных для поиска, немного похожие на индексы в базе данных. Затем все ваши модификации должны убедиться, что индексы обновлены. Хорошими примерами могут быть карты или мультикарты — перед обновлением удалите запись из любых индексов, а затем после обновления добавьте их обратно с новыми значениями. Очевидно, что это требует осторожности с параллелизмом и т. д.

0
ответ дан 3 November 2019 в 05:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: