Java-为什么HashMap中的哈希和键是最终的

Java-为什么HashMap中的哈希和键是最终的,java,hashmap,Java,Hashmap,在java中,HashMap在内部使用实现Map.Entry的节点,并具有以下结构: static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; Node<K,V> next; 我想知道为什么散列和键是final和value,而next不是 散列和键定义了该节点在HashMap数

在java中,HashMap在内部使用实现Map.Entry的节点,并具有以下结构:

static class Node<K,V> implements Map.Entry<K,V> {
        final int hash;
        final K key;
        V value;
        Node<K,V> next;

我想知道为什么散列和键是final和value,而next不是

散列和键定义了该节点在HashMap数据结构中的位置,因此,重要的是,一旦插入该节点,就不能对其进行更改,以便再次找到该节点

存储的实际值与HashMap的观点无关;我想,如果您更改与键关联的值,那么不需要创建新节点可能是一种轻微的优化


如果从映射中添加/删除元素,则下一个节点可能会更改。

哈希和键定义了该节点在哈希映射数据结构中的位置,因此在插入节点后不能更改这些节点非常重要,以便再次找到该节点

存储的实际值与HashMap的观点无关;我想,如果您更改与键关联的值,那么不需要创建新节点可能是一种轻微的优化

如果从映射中添加/删除元素,则下一个节点可能会更改。

哈希-这是最终结果,因为一旦使用哈希值创建节点,它就不应该更改,即使是意外更改

密钥-仅仅将哈希作为最终值是没有意义的,因为哈希是基于密钥的。所以,哈希和键都应该是最终的,原因很明显

值-节点中的值总是可以更改的,因此没有必要将其设置为最终值

下一步-这只是一个指针,在hashmap数据结构中,下一步可以指向不同的映射条目,因为它会增长插入/删除或重新构造灰化。所以再次强调,没有必要让它成为最终结果。但请记住,节点/条目包含的密钥永远不会更改。

散列-这是最终的,因为一旦使用散列值创建节点,它就不应该更改,即使是意外更改

密钥-仅仅将哈希作为最终值是没有意义的,因为哈希是基于密钥的。所以,哈希和键都应该是最终的,原因很明显

值-节点中的值总是可以更改的,因此没有必要将其设置为最终值


下一步-这只是一个指针,在hashmap数据结构中,下一步可以指向不同的映射条目,因为它会增长插入/删除或重新构造灰化。所以再次强调,没有必要让它成为最终结果。但是请记住,节点/条目包含的密钥永远不会更改。

它需要处理重新散列。但是,我不太清楚如何处理。

它需要处理重新散列。但是,我不太清楚如何使用。

在Java 7中,HashMap没有在内部使用任何节点,您可能会被一些东西弄糊涂。你的意思是进入吗?但它的结构略有不同。@Andremoniy至少在Java8中是这样:@assylias哦,好的。它是Java8。以前的版本不支持Java 7 HashMap,因为它在内部没有使用任何节点,您可能会被一些东西弄糊涂。你的意思是进入吗?但它的结构略有不同。@Andremoniy至少在Java8中是这样:@assylias哦,好的。它是Java8。以前的版本不知道散列和密钥是否是非最终的,如何修改它们?hashcode每次都计算相同的哈希代码。@GauravSeth从技术上讲,无论您在Node类中定义为非final,都可以在其他类中更改相同的值。作为一名开发人员,为了防止其他人犯此类错误,您应该将其声明为final。如果hash和key是非final的,那么将以何种方式对其进行修改?hashcode每次都计算相同的哈希代码。@GauravSeth从技术上讲,无论您在Node类中定义为非final,都可以在其他类中更改相同的值。作为一名开发人员,如果你不想让其他人犯这样的错误,你应该宣布它是最终的。