【问题标题】:add() method on entrySet() in Map<>Map<> 中 entrySet() 上的 add() 方法
【发布时间】:2018-11-01 11:21:49
【问题描述】:

在使用 for 循环迭代 Map&lt;&gt;

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

我发现entrySet()方法返回了一组Entry&lt;K,V&gt;

所以它有add(Entry&lt;K,V&gt; e) 方法

然后我创建了一个实现Map.Entry&lt;K,V&gt; 的类并尝试像下面这样插入对象

    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 是什么类型的?
  • @OHGODSPIDERS 我在这里使用了 HashMap

标签: java dictionary entryset


【解决方案1】:

来自entrySet() 方法的JavaDoc:

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

【讨论】:

    【解决方案2】:

    问题是您在HashMapentrySet() 上调用add() 方法,并且在该类中没有这样的实现,只有在它的超类中

    来自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.EntrySetAbstractSet 都没有),所以将使用来自AbstractCollection 的方法,其定义如下:

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

    另外,看entrySet() Javadoc

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        此实现总是抛出 UnsupportedOperationException。

        然后子类覆盖它和public void add(int size, E element); HashMap 中的子类 EntrySet 不会覆盖它。

        【讨论】:

          猜你喜欢
          • 2020-06-10
          • 2012-08-04
          • 1970-01-01
          • 1970-01-01
          • 2011-04-21
          相关资源
          最近更新 更多