2

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)
4

4 回答 4

4

从 JavaDoc onentrySet()方法:

该集合支持元素移除,即通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作从映射中移除相应的映射。它不支持 add 或 addAll 操作。

于 2018-11-01T11:30:54.253 回答
1

问题是您在 of 上调用方法,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()method 没有被覆盖(既不在 in HashMap.EntrySet,也不在 in ),将使用AbstractSet一个方法 from ,它具有以下定义:AbstractCollection

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

另外,查看entrySet()Javadoc

(...) 集合支持元素移除,即通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作从映射中移除相应的映射。它不支持 add 或 addAll 操作。

于 2018-11-01T11:34:12.107 回答
1

方法 java.util.HashMap.entrySet() 返回一个类 java.util.HashMap.EntrySet,它本身没有实现方法 Set.add()。
要将对象添加到集合中,您必须使用方法 myMap.put(entry.getKey(), entry.getValue())。

方法 entrySet() 仅用于读取数据,不用于修改。

于 2018-11-01T12:02:30.217 回答
0

该方法的javadoc https://docs.oracle.com/javase/10/docs/api/java/util/AbstractCollection.html#add(E)

此实现总是抛出 UnsupportedOperationException。

然后子类覆盖它并且public void add(int size, E element); 子类EntrySetHashMap覆盖它。

于 2018-11-01T11:32:40.987 回答