2

entrySet() Set<Map.Entry<K,V>>マップのデータ構造を学習していますが、マップ インターフェイス内を理解するのに苦労しています。これはネストされた自己参照であるはずですか? 参考までに、これはjava.util.Map<K,V>インターフェイスの定義からの抜粋です。

public interface Map<K,V> {
    Set<Map.Entry<K,V>> entrySet();
    ...
}
4

2 に答える 2

5

これはネストされた自己参照であるはずですか?

Mapいいえ。このメソッドの結果として が返すものは、インターフェースに従うオブジェクト インスタンスでなければならず、これは thisのエントリのSet内容を反映しているとだけ言っています。Mapと同じ.keySet()です。

Seta のエントリは(/に対して定義されたコントラクトの結果としてMap) 一意であり、キーも一意であるため、両方が s であることは理にかなっています (ただし、キーについては、 /が確実に尊重されるようにする責任があります)。Map.Entry.equals().hashCode().equals().hashCode()

ただし、注意が必要です。これらの方法の両方について、javadoc は次のように述べています。

セットはマップに支えられているため、マップへの変更はセットに反映され、その逆も同様です。

これは、注意しないと問題を引き起こす可能性があります。

この例を見てください:

public static void main(final String... args)
{
    final Map<String, String> map = new HashMap<>();
    map.put("hello", "world");
    map.put("foo", "bar");

    // Create a map entry
    final Map.Entry<String, String> entry
        = new AbstractMap.SimpleEntry<>("foo", "bar");

    // Remove it from the set
    map.entrySet().remove(entry);
    System.out.println("after removing entry: " + map);

    // Remove a key
    map.keySet().remove("hello");
    System.out.println("after removing key: " + map);
}

結果:

after removing entry: {hello=world}
after removing key: {}
于 2013-06-21T07:53:48.043 に答える