我有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操作有效地修改 这个设置使它的值是两组的并集。行为 如果修改了指定的集合,则此操作未定义 正在进行操作。
答案 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操作。
答案 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());
然后,您可以添加任何想要的内容。