Java 为什么在重新灰化时需要HashMap重新定位元素?

Java 为什么在重新灰化时需要HashMap重新定位元素?,java,hashmap,Java,Hashmap,当hashmap达到允许的大小(容量*loadFactor)时,它会自动增加,然后所有元素都会重新定位到新的索引中。那么,为什么需要执行此重新定位 因为它使哈希表稀疏,允许元素放在自己的桶中,而不是堆积在少量的桶中 当多个元素命中同一个存储桶时,HashMap必须创建一个列表(有时甚至是一个树),这对内存占用和元素检索性能都不利。因此,为了防止此类冲突的数量,HashMap正在增加其内部哈希表并重新哈希。需要重新哈希,因为将键值映射到存储桶时使用的计算取决于存储桶的总数。当桶的数量发生变化(以增

当hashmap达到允许的大小(容量*loadFactor)时,它会自动增加,然后所有元素都会重新定位到新的索引中。那么,为什么需要执行此重新定位

因为它使哈希表稀疏,允许元素放在自己的桶中,而不是堆积在少量的桶中


当多个元素命中同一个存储桶时,
HashMap
必须创建一个列表(有时甚至是一个树),这对内存占用和元素检索性能都不利。因此,为了防止此类冲突的数量,
HashMap
正在增加其内部哈希表并重新哈希。

需要
重新哈希
,因为将
值映射到存储桶时使用的计算取决于存储桶的总数。当桶的数量发生变化(以增加容量)时,新的映射计算可能会将给定的
映射到不同的桶

换句话说,查找以前的部分或全部条目可能无法正常运行,因为在增加备份存储后,条目位于错误的存储桶中

虽然这看起来很不幸,但实际上您希望映射函数考虑可用的bucket总数。通过这种方式,可以利用所有bucket,并且不会将任何条目映射到不存在的bucket


还有其他数据结构不具有此属性,但这是哈希映射工作的标准方式。

哈希映射预期O(1)访问的全部原因是每个存储桶预期有O(1)个元素。如果不调整贴图的大小,则每个bucket将有O(n)个元素。