entrySet() Set<Map.Entry<K,V>>
マップのデータ構造を学習していますが、マップ インターフェイス内を理解するのに苦労しています。これはネストされた自己参照であるはずですか? 参考までに、これはjava.util.Map<K,V>
インターフェイスの定義からの抜粋です。
public interface Map<K,V> {
Set<Map.Entry<K,V>> entrySet();
...
}
これはネストされた自己参照であるはずですか?
Map
いいえ。このメソッドの結果として が返すものは、インターフェースに従うオブジェクト インスタンスでなければならず、これは thisのエントリのSet
内容を反映しているとだけ言っています。Map
と同じ.keySet()
です。
Set
a のエントリは(の/に対して定義されたコントラクトの結果として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: {}