鍵はkeySet
どこから来るのですか?このクラスKeySet
は の内部クラスであり、変数にHashMap
アクセスできますが、参照するマップのキーのみを格納HashMap
する のような直接変数はありません。Set<K>
Entry<K,V>[]
テーブルしか見つかりません。しかし、それはキーと値を保存しています。メソッドは、参照を作成するために呼び出されたときに何かを行いますか
? 次のようになります。keySet()
new KeySet()
for(Entry e : table) {
keySet.put(e.getKey());
}
次に、キーセットにキーが保存され、キー値を追加または削除するとkeySet
、同じキーも追加または削除されますか?
public Set<K> keySet() {
Set<K> ks = keySet;
return (ks != null ? ks : (keySet = new KeySet()));
}
ソースコードには だけが表示されますnew KeySet()
が、なぜ空ではないのにキーがあるのですか? 明確にするために:
Map map = new HashMap();
map.put(1, 1); //null
map.keySet(); //[1]
map.put(2, 2); //[1,2]
map.remove(2); //[1]
各行でデバッグとブレークポイントを行い、各行を検査し、マップの keySet 変数を確認すると、上記の結果が表示されますよね?
keySet() が呼び出されると、put と remove は keySet に同じ効果をもたらしますよね? HashMap のメソッド put と remove を見てきました。
「put()」の場合、「table[bucketIndex] = new Entry<>(hash, key, value, e);」を呼び出した後、addEntry -> createEntry -> を呼び出した場合 keySet はキーを追加し、
for "remove()" ->removeEntryForKey -> table[i] = next; を呼び出した後。keySet のキーが削除されたので、table[] と keySet の間に何らかの関連があるに違いないと思い、この質問をしました...