Конструктор копирования, данный @Stephen C, - это путь, когда у вас есть Set
, который вы создали (или когда вы знаете, откуда он).
Когда речь идет о Map.entrySet()
, это будет зависеть от используемой реализации Map
:
findbugs говорит
Метод entrySet () может возвращать представление базового
Карта, на которой один объект Entry используется повторно и возвращается во время
итерация. Начиная с Java 1.6, IdentityHashMap и EnumMap делали это.
При итерации по такой карте значение Entry будет действительным только до
Вы переходите к следующей итерации. Если, например, вы пытаетесь пройти
такая запись устанавливает метод addAll, все пойдет не так.
Поскольку addAll()
вызывается конструктором копирования, вы можете оказаться с Набором только из одной Записи: последней.
Не все Map
реализации делают это, поэтому, если вы знаете, что ваша реализация безопасна в этом отношении, конструктор копирования определенно подходит. В противном случае вам придется самостоятельно создавать новые Entry
объекты:
Set<K,V> copy = new HashSet<K,V>(map.size());
for (Entry<K,V> e : map.entrySet())
copy.add(new java.util.AbstractMap.SimpleEntry<K,V>(e));
Редактировать: В отличие от тестов, которые я выполнял на Java 7 и Java 6u45 (благодаря Стивену С), комментарий findbugs больше не выглядит уместным. Возможно, это имело место в более ранних версиях Java 6 (до u45), но мне не нужно ничего тестировать.