里面的钥匙keySet
从哪里来?该类KeySet
是 的内部类HashMap
,它可以访问HashMap
变量,但没有像 aSet<K>
这样的直接变量,它只存储要引用的映射键。
我只能找到一张Entry<K,V>[]
桌子。但它已经存储了键和值。当调用该方法进行引用时
,该方法是否会keySet()
执行某些操作?new KeySet()
可能是这样的:
for(Entry e : table) {
keySet.put(e.getKey());
}
那么keySet存储的keys,当添加或删除一个key-value时,它也会添加或删除keySet
相同的keys吗?
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]
在每一行调试和断点,检查每一行并观察 map 的 keySet 变量会显示上面的结果,对吗?
一旦 keySet() 被调用,put 和 remove 对 keySet 的效果是一样的,对吧?我已经查看了 HashMap 的 put 和 remove 方法。
对于“put()”,如果调用 addEntry -> createEntry -> 在调用“table[bucketIndex] = new Entry<>(hash, key, value, e);”之后 keySet 将添加密钥,
for "remove()" ->removeEntryForKey -> 调用 table[i] = next; keySet中的key被删除了,所以我认为table[]和keySet之间一定有某种关联,然后我问了这个问题......