Вопрос по hashcode, hashset, java, hashmap – Java: изменить идентификатор, который изменяет хэш-код

5

Я использую HashSet и мне нужно изменить идентификатор объекта, но он меняет хеш-код и нарушает HashSet и правила метода hashCode ().

Что является лучшим решением: удалить объект из Set и добавить объект с новым идентификатором или сохранить хеш-код (например, созданный в конструкторе) в каждом объекте в Set, или есть другой способ решения этой проблемы?

Спасибо за помощь.

ОБНОВИТЬ: Я сделал ошибку: хранить хеш-код в объекте ужасно, потому что в этом случае одинаковые объекты могут иметь разные хеш-коды.

Можете ли вы переопределитьhashCode так делает то что хочешь? Starkey
По определению, ID (entifier) никогда не должен изменяться для данного объекта. Почему вы позволяете идентификатору объекта быть изменяемым? StriplingWarrior
Да, путь должен быть следующим: 1. Удалить объект из любого набора 2. Изменить его 3. Вставить обратно. Вы можете в конечном итоге обнаружить, что такой объект уже существует, так что вдвойне хорошо, что вы удалили его. Marko Topolnik
Ну, я не могу сгенерировать тот же хэш-код, когда я изменил свой идентификатор. avrilfanomar
Это потому, что я должен сохранить идентификаторы, например, 1,2,3 ... и когда я удаляю объект, я изменяю идентификаторы, если это необходимо. Это просто неправильно, да? avrilfanomar

Ваш Ответ

1   ответ
8

удаляет) через хеш-код элементов, которые вы в него помещаете. Хэш-код часто создается состоянием членов его экземпляра. Таким образом, хэш-код изменяется в зависимости от состояния объекта.

Документацияобъект говорит: "поддерживать общий контракт для метода hashCode (), который гласит, что равные объекты должны иметь одинаковые хэш-коды"

Как вы заметили, если вы измените состояние объекта, который вы храните в HashSet, доступ к объекту больше не будет возможен с помощью метода remove или найден с помощью метода contains в HashMap.

Варианты, которые вы предлагаете:

Remove the object, change it and add it again - works wonderful, easiest way if a HashSet is mandatory

Keep the value of the hash code 'somewhere' - Means, you have the same hash code for objects which are not equal. Or if you obey the documentation you can encounter two objects which are equals and have the same hash code, but their member variables differ! This can lead to unpredictable errors.

может быть недоразумение? Если вы помещаете объект в HashMap и выбираете ключ самостоятельно (например, int), то вы можете изменить сам объект так, как вам нравится, если вы не меняете ключ. Таким образом, ключ не (обязательно) связан с состоянием объектов ...
убрал опцию HashMap
Правильно. Но поскольку ОП пытается изменить ключи после добавления объектов в HashSet. Если вы предполагаете, что ключ должен быть отделен от объекта, а объект должен быть частью значения HashMap, это не относится к тому же вопросу.
Последний вариант абсолютно не соответствует действительности. Фактически, HashSet реализован с использованием HashMap. Если вы измените состояние содержимого объекта, HashMaps и HashSets сломаются.

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