为什么函数getKey,getValue和setValue与Map无关?

时间:2012-12-31 05:37:53

标签: java

根据Effective Java,第22项,

  

许多Map实现都为地图中的每个键值对都有一个内部Entry对象。   虽然每个条目都与一个地图相关联,但是条目上的方法   (getKey,getValue和setValue)不需要访问地图。

你能解释一下这意味着什么吗?您能举例说明典型的Map实现,以显示这些函数如何不依赖于Map内部结构吗?

2 个答案:

答案 0 :(得分:2)

这是java.util.HashMap.Entry实现

static class Entry<K,V> implements Map.Entry<K,V> {
        final K key;
        V value;
        Entry<K,V> next;
        final int hash;

        ...

        public final K getKey() {
            return key;
        }

        public final V getValue() {
            return value;
        }

        public final V setValue(V newValue) {
            V oldValue = value;
            value = newValue;
            return oldValue;
        }
        ...

正如您所看到的,getKey,getValue和setValue仅适用于Entry的字段,并且不需要访问HashMap本身。

但是HashMap当然需要访问它的条目,因此它将它们作为数组保存在字段中

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {
    ...
    Entry[] table;
    ...

答案 1 :(得分:0)

地图包含许多Entry个对象。您可以将Entry视为键值对。

它是Map包含的条目和条目,没有任何访问Map的权限。

Entry可以访问自己的字段,但不能访问hashmap中的其他条目,即条目可以为其自己的包含字段提供getter和setter,并且无权访问HashMap。