根据 Effective Java,第 22 条,
许多 Map 实现对于 map 中的每个键值对都有一个内部 Entry 对象。虽然每个条目都与映射相关联,但条目上的方法(getKey、getValue 和 setValue)不需要访问映射。
你能解释一下这是什么意思吗?您能否举一个典型的 Map 实现示例来说明这些函数如何不依赖于 Map 内部?
根据 Effective Java,第 22 条,
许多 Map 实现对于 map 中的每个键值对都有一个内部 Entry 对象。虽然每个条目都与映射相关联,但条目上的方法(getKey、getValue 和 setValue)不需要访问映射。
你能解释一下这是什么意思吗?您能否举一个典型的 Map 实现示例来说明这些函数如何不依赖于 Map 内部?
这是 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;
...
地图由许多Entry
对象组成。您可以将 Entry 视为键值对。
它是 Map 包含条目,而条目对 Map 没有任何访问权限。
条目可以访问它自己的字段,但不能访问哈希图中的其他条目,即条目可以为其自己包含的字段提供getter 和setter,并且不能访问HashMap。