在 HashMap 中进行 put 操作时,如果发生冲突,是将 map 进行扩容还是将该条目添加到特定桶(bucket)的列表中?
在 HashMap 中进行 put 操作时,如果发生冲突,是将 map 进行扩容还是将该条目添加到特定桶(bucket)的列表中?
当你说“碰撞”时,是指相同的哈希码吗?哈希码用于确定 HashMap 中应该使用哪个桶(bucket),而桶是由所有具有相同哈希码的条目(entry)组成的链表。在返回或插入(get/put)之前,将比较这些条目是否相等(使用 .equals()函数)。
请注意,这仅适用于特定的 HashMap 实现(因为这是你提问的那种实现),其他实现可能会有所不同。
这两种情况都有可能发生 - 这取决于HashMap的填充比例。
通常情况下,元素将被添加到该桶的列表中 - HashMap类的设计使得重新调整大小相对较少(因为它们更加昂贵)。
java.util.HashMap
的文档详细解释了何时调整哈希表的大小:
HashMap 实例有两个影响其性能的参数:初始容量和负载因子。
容量是哈希表中的桶数,而初始容量只是创建哈希表时的容量。
负载因子是哈希表在其容量自动增加之前允许填充的程度的一种度量。
当哈希表中的条目数超过负载因子和当前容量的乘积时,哈希表会被重新哈希(即内部数据结构被重建),以便哈希表具有大约两倍的桶数。
默认的初始容量为16,负载因子为0.75。您可以在映射的构造函数中提供其他值。
当负载因子达到时,将进行重新调整大小。
在HashMap中进行put操作时,如果发生碰撞,则将该条目添加到特定“桶”中的列表中。如果达到了负载因子,则会重新调整HashMap的大小。