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作为这个方法的结果返回的任何东西都必须是一个遵循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: {}
于 2013-06-21T07:53:48.043 回答
1
Set<Map.Entry<K,V>>

上面的类型表示:一组映射条目。Map.Entry是嵌套在接口内部的Map接口。不涉及自引用,但从返回的集合类型entrySet重用<K,V>了包含映射的类型绑定。

映射条目是一对(键,值),整个映射在概念上只是一组映射条目。此地图视图非常适合迭代地图完整内容的用例,但不适合按键检索,这是地图的主要用例。

于 2013-06-21T08:10:15.493 回答