【问题标题】:Why not support add/addAll operations for the set returned from entrySet()?为什么不支持 entrySet() 返回的集合的 add/addAll 操作?
【发布时间】:2018-10-24 07:59:53
【问题描述】:

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

我注意到 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);
    }
}

【问题讨论】:

  • 只是为了澄清一下,您在看什么 JDK 版本?我在 JDK 1.8.0 u152 的代码中没有看到。
  • 你指的是哪个 EntrySet 类?有多个具有该名称的类,例如:java.util.TreeMap.EntrySet、java.util.HashMap.EntrySet、java.util.EnumMap.EntrySet 等。pp
  • @OHGODSPIDERS java.util.Hashtable.EntrySet
  • @OliverCharlesworth 我使用 JDK1.8.0_65。很抱歉造成混淆,源代码是java.util.Hashtable.EntrySet.add(Map.Entry&lt;K, V&gt; o)

标签: java hashmap hashtable


【解决方案1】:

它是按照 Map.entrySet javadocs:

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

【讨论】:

  • 但是为什么设计上不支持add或者addAll操作呢?
  • 我们只能猜测,因为它从未在 API 和 Effective Java 中解释过。可能设计师认为这没有意义。
【解决方案2】:

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

【讨论】:

  • 为什么它比原始地图更少意识到这一点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
相关资源
最近更新 更多