Коллекции Java с изменяемыми объектами - PullRequest
9 голосов
/ 29 августа 2010

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

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

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

Ответы [ 3 ]

4 голосов
/ 29 августа 2010

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

Добавление:

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

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

2 голосов
/ 29 августа 2010

Быть изменяемым является проблемой для коллекции только в том случае, если hashCode объекта и поведение методов сравнения изменяются после его вставки.

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

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

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

0 голосов
/ 29 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...