Как получить неизменяемую коллекцию из Java HashMap? - PullRequest
8 голосов
/ 28 января 2012

Мне нужно получить коллекцию из jash HashMap без изменений карты, отраженных в коллекции позже.Я хотел использовать Collection.toArray () для достижения этой цели, но это не работает.Результирующий Object [] также изменяется (javadocs говорит, что возвращенный массив будет «безопасным» в том смысле, что в этой коллекции нет ссылок на него).Есть ли простой способ добиться этого?

Ответы [ 5 ]

9 голосов
/ 28 января 2012

Невозможно сделать это одним вызовом API, вам необходимо использовать глубокое клонирование.Клоны не будут изменены при внесении изменений в оригинал.Эта тема уже обсуждалась на SO ранее, см. Как клонировать ArrayList, а также клонировать его содержимое? и Рекомендация утилиты глубокого клонирования .

8 голосов
/ 28 января 2012
2 голосов
/ 28 января 2012

Следующее остается в силе и описывает наблюдаемую проблему (см. Бит о том, какой тип копирования выполняется).Однако я не даю никакого ответа на вопрос , как выполнить глубокое копирование.

Вместо этого мое предложение состоит в том, чтобы проектировать объекты как неизменный , что полностью устраняет эту проблему.По моему опыту это работает очень хорошо для большинства тривиальных объектов (то есть объектов, которые не являются «контейнерами») и может упростить код и рассуждения об этом.


Из Javadoc для HashMap.values:

Возвращает представление коллекции значений, содержащихся в этой карте. Коллекция поддерживается картой , поэтому изменения карты отражаются в коллекции , и наоборот ...

Возможно, это будетбыло бы полезно создать его копию?

HashMap<K,V> map = ....;
List<V> values = new ArrayList<V>(map.values());

Что, по сути, выполняет мелкую копию , которая «теперь отделена».Однако, если является мелкой копией , клонирование / копирование содержащихся объектов не выполняется .(См. Ответ βнɛƨн Ǥʋяʋиɢ, если глубокая копия семантика желательна: сам вопрос кажется немного расплывчатым по этому вопросу.)

Удачное кодирование

2 голосов
/ 28 января 2012

Вы можете создать неизменяемую карту

0 голосов
/ 28 января 2012

Создайте поверхностную копию исходной карты с HashMap.clone(), а затем извлеките из нее набор значений.Это создаст новые ссылки на объекты в исходной карте во время вызова clone();очевидно, что изменения внутри самих содержащихся объектов все равно будут отражены в скопированной коллекции.Если вам нужно такое поведение, ваш единственный способ - скопировать объекты карты в нужной коллекции.

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