Add () для entrySet () в Map <>

При повторении Map<> с использованием цикла for

for(Map.Entry<K,V> mapEntry : myMap.entrySet()){
    // something
}

Я обнаружил, что метод entrySet() возвращает набор Entry<K,V>

так что у него есть метод add(Entry<K,V> e)

затем я создал класс, реализующий Map.Entry<K,V>, и попытался вставить объект, как показано ниже

    public final class MyEntry<K, V> implements Map.Entry<K, V> {

    private final K key;
    private V value;

    public MyEntry(K key, V value) {
        this.key = key;
        this.value = value;
    }

    @Override
    public K getKey() {
        return key;
    }

    @Override
    public V getValue() {
        return value;
    }

    @Override
    public V setValue(V value) {
        V old = this.value;
        this.value = value;
        return old;
    }

}


Entry<String, String> entry = new MyEntry<String, String>("Hello", "hello");
myMap.entrySet().add(entry); //line 32

нет ошибки компиляции, но это вызывает ошибку времени выполнения

    Exception in thread "main"
java.lang.UnsupportedOperationException
    at java.util.AbstractCollection.add(AbstractCollection.java:262)
    at com.seeth.AboutEntrySetThings.main(AboutEntrySetThings.java:32)

Какой тип у myMap?

OH GOD SPIDERS 01.11.2018 12:28

@OHGODSPIDERS Я использовал HashMap здесь

Seethend Reddy 01.11.2018 12:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
2 966
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Из метода JavaDoc на entrySet():

The set supports element removal, which removes the corresponding mapping from the map, via the Iterator.remove, Set.remove, removeAll, retainAll and clear operations. It does not support the add or addAll operations.

Документация для этого метода https://docs.oracle.com/javase/10/docs/api/java/util/AbstractCollection.html#add(E) говорит

This implementation always throws an UnsupportedOperationException.

Затем подклассы переопределяют его и public void add(int size, E element); Подкласс EntrySet в HashMap не отменяет его.

Проблема в том, что вы вызываете метод add() на entrySet() из HashMap и в этом классе нет такой реализации, только в его суперклассах.

Из исходного кода HashMap:

public Set<Map.Entry<K,V>> entrySet() {
    Set<Map.Entry<K,V>> es;
    return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
}

final class EntrySet extends AbstractSet<Map.Entry<K,V>> {
// there is no add() override
}

Поскольку метод add() не переопределяется (ни в HashMap.EntrySet, ни в AbstractSet), будет использоваться метод из AbstractCollection, который имеет следующее определение:

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

Также, глядя на entrySet() Javadoc:

(...) The set supports element removal, which removes the corresponding mapping from the map, via the Iterator.remove, Set.remove, removeAll, retainAll and clear operations. It does not support the add or addAll operations.

Метод java.util.HashMap.entrySet () возвращает класс java.util.HashMap.EntrySet, который сам по себе не реализует метод Set.add ().
Чтобы добавить объект в коллекцию, необходимо использовать метод myMap.put (entry.getKey (), entry.getValue ()).

Метод entrySet () используется только для чтения данных, а не для модификации.

Другие вопросы по теме