map.keyset()返回set的哪个实现,以及为什么它不支持添加操作呢?

时间:2016-11-23 06:46:04

标签: java dictionary collections

为什么这会抛出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");
}

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

答案在documentation

  

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

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

答案 2 :(得分:0)

!is.na(ROW)返回的结果不支持添加元素。它不支持df1 = df[-which(rowSums(!is.na(df))==0),] 操作。它仅支持keySet()

有关详细信息,请阅读this