【发布时间】:2015-10-26 12:53:12
【问题描述】:
keySet 中的密钥从何而来?
KeySet 类是 HashMap 的内部类,它可以访问 HashMap 变量,但没有像 Set<K> 这样的直接变量,它只存储要引用的映射键。
我只能找到Entry<K,V>[] 表。但它已经存储了键和值。
当调用new KeySet() 进行引用时,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(),但是为什么不是空的,但是有key?为了更清楚:
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之间一定有某种关联,然后我问了这个问题……
【问题讨论】:
-
“我希望我已经清楚地说明了我的问题”——恐怕一点也不。不清楚您是否已经看过代码并且不了解它是如何工作的,或者您是否正在尝试猜测代码的外观。
-
-
你看过JDK中的代码了吗?
-
@JonSkeet 是的,但是为什么“keySet = new KeySet()”不返回一个空集,但一个集包含映射键