49

HashMap の 2 つの異なるインスタンスがあります

両方の HashMap のキーセットをマージしたい。

コード:

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(コレクションc)

指定されたコレクション内のすべての要素がまだ存在しない場合は、このセットに追加します (オプションの操作)。指定されたコレクションもセットである場合、addAll 操作はこのセットを効果的に変更し、その値が 2 つのセットの和集合になるようにします。操作の進行中に指定されたコレクションが変更された場合、この操作の動作は未定義です。

4

5 に答える 5

57

メソッドのドキュメントを見ると、HashMap#keySet()答えが得られます(私の強調)。

このマップに含まれるキーの Set ビューを返します。セットはマップに支えられているため、マップへの変更はセットに反映され、その逆も同様です。セットに対する反復の進行中にマップが変更された場合 (反復子自体の削除操作を除く)、反復の結果は未定義です。このセットは要素の削除をサポートしており、Iterator.remove、Set.remove、removeAll、retainAll、および clear オペレーションを介して、対応するマッピングをマップから削除します。add または addAll 操作はサポートされていません。

Setしたがって、によって返される に要素を追加するのではなく、新しいセットを作成してすべての要素を追加する必要がありますkeySet()

于 2013-11-13T10:06:04.743 に答える
34

の結果はkeySet()、要素の追加をサポートしていません。

変更しようとしているのではなくhashMap1、2 つのマップのキーの和集合を含むセットが必要な場合は、次を試してください。

Set<String> mySet = new HashSet<String>();
mySet.addAll(hashMap1.keySet());
mySet.addAll(hashMap2.keySet());
于 2013-11-13T10:05:45.577 に答える