有効な Java の項目 22 に従って、
多くの Map 実装には、マップ内のキーと値のペアごとに内部 Entry オブジェクトがあります。各エントリはマップに関連付けられていますが、エントリのメソッド (getKey、getValue、および setValue) はマップにアクセスする必要はありません。
それが何を意味するのか説明できますか?これらの関数が Map 内部に依存していないことを示すために、典型的な Map 実装の例を挙げていただけますか?
有効な Java の項目 22 に従って、
多くの 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 はキーと値のペアと考えることができます。
エントリが含まれるマップであり、エントリにはマップへのアクセス権がありません。
エントリは自身のフィールドにアクセスできますが、ハッシュマップ内の他のエントリにはアクセスできません。つまり、エントリは自身の含まれるフィールドにゲッターとセッターを提供できますが、HashMap にはアクセスできません。