2016-11-23 7 views
-2

これがなぜ投げているのですかUnsupportedExceptionmap.keyset()が返すsetの実装と、その上にadd operatonをサポートしない理由は何ですか?

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"); 
} 
+2

Javadocを読んでくださいadd or addAll operations.Itが唯一の詳細はremove, removeAll, retainAll, and clear operations.

をサポートしてサポートしていません。 -versa "_値を指定せずにキーセットに新しいキーを追加すると、どのようなセマンティクスが期待できますか? –

答えて

3

Mapインターフェイスでは、keySet()が返す必要があるSetの実装が定義されていません。具体的には、HashMap#keySet()は、内部クラスjava.util.Map$KeySetのインスタンスを返します。返されたSetMapのキーを表します。したがって、追加することは、本質的にマップにキーを追加することを意味します。最終的には、これはJDK開発者が採用した設計上の決定ですが、IMHOは正しい方法です。この操作は許可されたものとします - この操作は何ですか?マップにnullの値を示すキーを追加しますか?追加したときに値に対して何らかの操作を実行するようにMapを拡張するとどうなりますか?このようなシナリオはどのように扱われますか?

2

答えはdocumentationである:

このマップに含まれるキーのSetビューを返します。 セットは です。マップへの変更はセットに反映され、 に反映されます。進行中のセットの反復が進行中である間にマップが変更された場合(イテレータの独自の削除操作を除いて)、反復の結果は未定義です( )。このセットは、対応するマッピングを イテレータを介してマップから削除する要素 をサポートしています。 remove,Set.remove,removeAll,retainAll、および明白な 操作。 addまたはaddAll操作をサポートしていません。

解決策は新しいセットを作成し、その結果を追加することです。しかし、あなたはkeySetメソッドから返された同じセットではありません。

0

keySet()によって返された結果では、要素の追加はサポートされていません。マップへの変更はセットに反映されるように_」セットは、マップによってバックアップされ、副:それはthis

関連する問題