首页 > 解决方案 > 为什么不支持 entrySet() 返回的集合的 add/addAll 操作?

问题描述

entrySet()方法Set<Map.Entry<K,V>>在 HashMap/HashTable 中返回。为什么 set 不支持 add/addAll 操作,我们知道 key 和 value 输入?

我注意到java.util.Hashtable.EntrySet.add(Map.Entry<K, V> o)Jdk1.8 中的实现如下:

private class EntrySet extends AbstractSet<Map.Entry<K,V>> {
    public boolean add(Map.Entry<K,V> o) {
        // MyNote: Call AbstractCollection<E>.add(E e) and 
        // throw UnsupportedOperationException
        return super.add(o);
    }
}

为什么不实现支持添加操作,如下所示:

private class EntrySet extends AbstractSet<Map.Entry<K,V>> {
    /**
    * @return <tt>false</tt> if key has exists
    */
    public boolean add(Map.Entry<K,V> o) {
        V old = Hashtable.this.put(o.getKey(), o.getValue());
        return (null == old);
    }
}

标签: javahashmaphashtable

解决方案


它符合 Map.entrySet javadocs:

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


推荐阅读