理解界面Map <k,v> </k,v>

时间:2013-06-21 07:52:09

标签: java map

我正在学习地图数据结构,我无法理解地图界面中的entrySet() Set<Map.Entry<K,V>>这应该是嵌套的自引用吗?作为参考,这是java.util.Map<K,V>接口定义的摘录:

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

2 个答案:

答案 0 :(得分:5)

  

这应该是嵌套的自引用吗?

没有。它只表示无论Map返回什么,因为此方法的结果必须是服从Set接口的对象实例,它反映了此Map条目的内容。它与.keySet()相同。

因为Set中的条目都是唯一的(as a result of the defined contract for Map.Entry's .equals()/.hashCode()),所以密钥都是唯一的(但是对于密钥,负责确保尊重Map / .equals()

但是,你必须要小心。对于这两种方法,javadoc说:

  

集合由地图支持,因此对地图的更改会反映在集合中,反之亦然。

如果你不小心,这可能会带来麻烦。

看看这个例子:

.hashCode()

结果:

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);
}

答案 1 :(得分:1)

Set<Map.Entry<K,V>>

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

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