2

根据 Effective Java,第 22 条,

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

你能解释一下这是什么意思吗?您能否举一个典型的 Map 实现示例来说明这些函数如何不依赖于 Map 内部?

4

2 回答 2

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;
    ...
于 2012-12-31T05:50:47.967 回答
0

地图由许多Entry对象组成。您可以将 Entry 视为键值对。

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

条目可以访问它自己的字段,但不能访问哈希图中的其他条目,即条目可以为其自己包含的字段提供getter 和setter,并且不能访问HashMap。

于 2012-12-31T05:54:59.163 回答