为什么不支持对entrySet()返回的集合进行add / addAll操作?

时间:2018-10-24 07:59:54

标签: java hashmap hashtable

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

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

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);
    }
}

2 个答案:

答案 0 :(得分:1)

它符合Map.entrySet javadocs:

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

答案 1 :(得分:0)

我看到的一个原因是EntrySet不知道它属于哪种集合,因此它不知道允许哪种键。