组合两个集合时java.lang.UnsupportedOperationException

时间:2013-11-13 10:03:35

标签: java collections set

我有2个不同的HashMap实例

我想合并两个HashMaps的键集;

代码:

Set<String> mySet = hashMap1.keySet();
mySet.addAll(hashMap2.keySet());

例外:

java.lang.UnsupportedOperationException
    at java.util.AbstractCollection.add(AbstractCollection.java:238)
    at java.util.AbstractCollection.addAll(AbstractCollection.java:322)

我没有收到编译警告或错误。

从java doc开始,这应该可行。即使添加的集合也是一组:

布尔addAll(收藏c)

  

将指定集合中的所有元素添加到此集合中   它们尚未存在(可选操作)。如果指定的话   集合也是一个集合,addAll操作有效地修改   这个设置使它的值是两组的并集。行为   如果修改了指定的集合,则此操作未定义   正在进行操作。

5 个答案:

答案 0 :(得分:44)

如果你查看HashMap#keySet()方法的文档,你会得到答案(强调我的)。

  

返回此地图中包含的键的Set视图。这套是   由地图支持,因此对地图的更改将反映在集合中,并且   反之亦然。如果在对集合进行迭代时修改了映射   正在进行中(通过迭代器自己的删除操作除外),   迭代的结果是未定义的。集支持元素   删除,通过删除从地图中删除相应的映射   Iterator.remove,Set.remove,removeAll,retainAll和clear   操作。 它不支持add或addAll操作。

因此,您需要创建一个新集并向其添加所有元素,而不是将元素添加到Set返回的keySet()

答案 1 :(得分:25)

keySet()的结果不支持向其中添加元素。

如果您不是要修改hashMap1但只想要一个包含两个地图键的并集的集合,请尝试:

Set<String> mySet = new HashSet<String>();
mySet.addAll(hashMap1.keySet());
mySet.addAll(hashMap2.keySet());

答案 2 :(得分:1)

不支持来自map.keySet()的Set的本质。它仅支持remove,removeAll,retainAll和clear操作。

请阅读documentation

答案 3 :(得分:0)

以上所有答案都是正确的。如果您仍想知道确切的实现细节(jdk 8)

hashMap1.keySet() returns a KeySet<E>

KeySet<E>   extends AbstractSet<E>
AbstractSet<E> extends AbstractCollection<E> 

在AbstractCollection中,

public boolean add(E e) {
        throw new UnsupportedOperationException();
    }

addAll() calls add()这就是为什么你得到UOException

答案 4 :(得分:0)

只需使用Map的键创建自己的Set,如下所示:

Set set = new HashSet(map.keySet()); 

然后,您可以添加任何想要的内容。