【问题标题】:Which implementation of set does map.keyset() returns, and why it does not support add operation on it? [duplicate]map.keyset() 返回 set 的哪个实现,为什么它不支持对其进行添加操作? [复制]
【发布时间】:2017-04-07 01:35:28
【问题描述】:

为什么会抛出UnsupportedException

public static void main(String[] args) {
    Map<String,String> map=new HashMap<String,String>();
    map.put("a", "a value");
    Set<String> set=map.keySet();
    set.add("b");
}

【问题讨论】:

  • Javadoc: " 集合由映射支持,因此对映射的更改会反映在集合中,反之亦然" 添加没有提供值的键集的新键?
  • 只需使用 Map 的键创建您自己的 Set,如下所示: Set set = new HashSet(map.keySet());然后你可以添加任何你想要的东西。

标签: java dictionary collections


【解决方案1】:

keySet() 返回的结果不支持添加元素。不支持add or addAll操作,只支持remove, removeAll, retainAll, and clear operations.

更多详情请阅读this

【讨论】:

    【解决方案2】:

    Map 接口没有定义Set 的哪个实现keySet() 应该返回。具体来说,HashMap#keySet() 返回内部类java.util.Map$KeySet 的实例。返回的Set 表示Map 的键,因此添加它实质上意味着向映射添加键。最终,这是 JDK 开发人员做出的设计决定,但恕我直言,这是正确的决定。假设这个操作是允许的——这个操作会做什么?向映射添加一个指向null 值的键?如果您扩展Map 以在添加值时对其执行一些操作怎么办?如何处理这种情况?

    【讨论】:

      【解决方案3】:

      答案在documentation

      返回此映射中包含的键的 Set 视图。 集合是 由地图支持,因此对地图的更改会反映在集合中,并且 反之亦然。如果在对集合进行迭代时修改了地图 进行中(通过迭代器自己的删除操作除外), 迭代的结果是不确定的。集合支持元素 移除,从地图中移除对应的映射,通过 迭代器。removeSet.removeremoveAllretainAll 和 clear 操作。 不支持addaddAll 操作

      解决方案是创建一个新集合,并将结果添加到其中。但不是您从 keySet 方法返回的同一组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-26
        • 1970-01-01
        • 1970-01-01
        • 2022-06-30
        • 1970-01-01
        • 2019-06-20
        • 2014-03-22
        • 1970-01-01
        相关资源
        最近更新 更多