java - 为什么不支持从entrySet()返回的集合的add/addAll操作?

标签 java hashmap hashtable

entrySet()方法返回 Set<Map.Entry<K,V>>在 HashMap/HashTable 中。为什么集合不支持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);
    }
}

最佳答案

它符合Map.entrySet javadocs:

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

关于java - 为什么不支持从entrySet()返回的集合的add/addAll操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52963751/

相关文章:

algorithm - 是否存在哈希表未满但无法插入的特定情况?

使用封闭的 <html> ... </html> 标签呈现的 JavaServer Faces 2.2 复合组件

java - 同时搜索多个HashMap

ruby - 如何从哈希中获取下一个哈希元素?

java - Java的HashMap中,从keySet中删除一个元素会影响hashmap对象吗?

javascript - 按字母顺序对 JavaScript 中的哈希表进行排序

python - C 数据结构

java - 如何将案例 1 的结果应用到另一个案例中

java - 在 Queue<byte[]> 中录制语音并将其发送到服务器

java - 具有不断变化的接口(interface)的装饰器模式