Подтвердить что ты не робот

Java.lang.UnsupportedOperationException при объединении двух наборов

У меня есть два разных экземпляра HashMap

Я хочу объединить ключи обоих HashMaps;

Код:

Set<String> mySet = hashMap1.keySet();
mySet.addAll(hashMap2.keySet());

Исключение:

java.lang.UnsupportedOperationException
    at java.util.AbstractCollection.add(AbstractCollection.java:238)
    at java.util.AbstractCollection.addAll(AbstractCollection.java:322)

Я не получаю предупреждение или ошибку компиляции.

Из java doc это должно работать. Даже если добавленная коллекция также является набором:

boolean addAll (коллекция c)

Добавляет все элементы в указанной коллекции к этому набору, если они еще не присутствуют (дополнительная операция). Если указанные коллекция также является набором, операция addAll эффективно изменяет этот набор так, чтобы его значение было объединением двух множеств. Поведение этой операции undefined, если указанная коллекция изменена пока выполняется операция.

4b9b3361

Ответ 1

Если вы посмотрите на документы метода HashMap#keySet(), вы получите ответ (выделение мое).

Возвращает представление Set для ключей, содержащихся на этой карте. Множество поддерживаемые картой, поэтому изменения в карте отражаются в наборе, и наоборот. Если карта изменена, а итерация по множеству (за исключением операции удаления собственного итератора), результаты итерации undefined. Набор поддерживает элемент удаление, которое удаляет соответствующее сопоставление с карты, через Iterator.remove, Set.remove, removeAll, saveAll и clear операции. Он не поддерживает операции add или addAll.

Следовательно, вам нужно создать новый набор и добавить к нему все элементы вместо добавления элементов в Set, возвращаемых keySet().

Ответ 2

Результат keySet() не поддерживает добавление к нему элементов.

Если вы не пытаетесь изменить hashMap1, а просто хотите установить набор, содержащий объединение ключей двух карт, попробуйте:

Set<String> mySet = new HashSet<String>();
mySet.addAll(hashMap1.keySet());
mySet.addAll(hashMap2.keySet());

Ответ 3

Не поддерживает по природе набор, который находится в map.keySet(). Он поддерживает только операции remove, removeAll, keepAll и clear.

Прочтите документацию

Ответ 4

Все приведенные выше ответы верны. Если вы все еще хотите узнать точную деталь реализации (jdk 8)

hashMap1.keySet() returns a KeySet<E> и

KeySet<E>   extends AbstractSet<E>
AbstractSet<E> extends AbstractCollection<E> 

В AbstractCollection,

public boolean add(E e) {
        throw new UnsupportedOperationException();
    }

addAll() calls add() и вот почему вы получаете UOException