use*_*048 34 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这应该工作.即使添加的集合也是一组:
boolean addAll(Collection c)
如果指定集合中的所有元素尚未存在(可选操作),则将其添加到此集合中.如果指定的集合也是一个集合,则addAll操作会有效地修改此集合,使其值为两个集合的并集.如果在操作正在进行时修改了指定的集合,则此操作的行为是不确定的.
Sud*_*hul 47
如果你查看HashMap#keySet()方法的文档,你会得到你的答案(强调我的).
返回此映射中包含的键的Set视图.该集由地图支持,因此对地图的更改将反映在集中,反之亦然.如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的.该集支持元素删除,它通过Iterator.remove,Set.remove,removeAll,retainAll和clear操作从地图中删除相应的映射.它不支持add或addAll操作.
因此,您需要创建一个新集并向其添加所有元素,而不是将元素添加到Set由keySet().返回的元素.
NPE*_*NPE 27
结果keySet()不支持向其添加元素.
如果您hashMap1不想修改但只想要一个包含两个地图键的并集的集合,请尝试:
Set<String> mySet = new HashSet<String>();
mySet.addAll(hashMap1.keySet());
mySet.addAll(hashMap2.keySet());