我正在学习地图数据结构知道,我很难理解entrySet() Set<Map.Entry<K,V>>
地图界面内的内容。这应该是嵌套的自引用吗?作为参考,这是接口定义的摘录java.util.Map<K,V>
:
public interface Map<K,V> {
Set<Map.Entry<K,V>> entrySet();
...
}
这应该是嵌套的自引用吗?
不,它只是说,Map
作为这个方法的结果返回的任何东西都必须是一个遵循Set
接口的对象实例,它反映了 thisMap
条目的内容。与 相同.keySet()
。
两者都是 s 是有道理Set
的,因为 a 中的条目Map
是唯一的(作为Map.Entry
's .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: {}
Set<Map.Entry<K,V>>
上面的类型表示:一组映射条目。Map.Entry
是嵌套在接口内部的Map
接口。不涉及自引用,但从返回的集合类型entrySet
重用<K,V>
了包含映射的类型绑定。
映射条目是一对(键,值),整个映射在概念上只是一组映射条目。此地图视图非常适合迭代地图完整内容的用例,但不适合按键检索,这是地图的主要用例。