在java中,HashMap
内部使用实现Node<K,V>
的{{1}}并具有以下结构:
Map.Entry<K,V>
我想知道为什么static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next;
和hash
key
以及final
和value
不是?
答案 0 :(得分:2)
哈希和键定义了这个Node
在HashMap的数据结构中的位置,因此一旦插入Node
就无法更改这些内容非常重要,以便Node
可以再次找到。
存储的实际值与HashMap的观点无关;我想如果您更改与密钥关联的值,则可能需要稍微优化,而不需要创建新的Node
。
如果您在地图中添加/删除元素,则下一个节点可能会更改。
答案 1 :(得分:2)
哈希 - 这是最终的,因为一旦创建了一个带有哈希值的节点,它甚至不会意外地改变。
密钥 - 只是将哈希作为最终版本没有意义,因为哈希是基于密钥的。因此,哈希和密钥都应该是最终的,原因很明显。
值 - 节点中的值总是可以更改,因此没有必要使其成为最终值。
next - 这只是一个指针,在hashmap数据结构中,接下来可以指向不同的地图条目,因为它增长(插入/删除)或重组(重新散列)。所以再没有必要让它成为最终的。但请记住,节点/条目包含的密钥永远不会改变。
答案 2 :(得分:0)
它可以处理重新散列。但是,我不太清楚如何。