哈希图中的存储桶数是什么意思?
我正在阅读有关Hashmap的信息。
HashMap 的实例有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中的存储桶数。
如果哈希图中有 10 个键值对。假设哈希码是不同的。
每个遗嘱都驻留在一个桶中,对吗?或者一个存储桶可以有多个键值对?
因为在英语中意味着一件大事,许多物体可以驻留。bucket
我正在阅读有关Hashmap的信息。
HashMap 的实例有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中的存储桶数。
如果哈希图中有 10 个键值对。假设哈希码是不同的。
每个遗嘱都驻留在一个桶中,对吗?或者一个存储桶可以有多个键值对?
因为在英语中意味着一件大事,许多物体可以驻留。bucket
是的,确切地说,每个存储桶可以有多个键值对。
对象通过以下表达式确定它进入哪个桶:,其中 n = 桶的总数,并且是模运算符。hashCode()
object.hashCode() % n
%
大多数情况下,对象将很好地分布在存储桶中,但您无法保证它们的位置。这取决于数据和哈希码函数。
显然,当哈希码实现很差时,哈希映射的性能会下降。
还要阅读相等/哈希码合约,这是相关的。
在java中,如果您将对象存储在HashMap中,则第一个HashMap实现调用hashCode()方法来查找存储桶位置。然后,它将两者存储:键和值作为条目。铌!它还存储密钥,因为它在检索对象期间至关重要。两个对象可以具有相同的哈希码,因此如果发生这种情况,HashMap将使用相同的存储桶位置,并将第二个对象也存储在那里。在里面,它使用LinkedList来实现这一点。(不是java.util.LinkedList,而是一个更简单的实现)
在检索过程中:您有一个键 -> hashCode() -> 存储桶位置 -> 在 LinkedList 中按键 -> 返回对象进行搜索。
编辑:所以你在同一位置有一个桶,但一个桶是一个LinkedList,所以它可以存储多个条目。因此,存储桶的数量是 Hashmap 的容量,并描述了您可以在不将它们链接到列表中的情况下存储多少个条目。
你可以在这里找到一篇很棒的文章和更详细的解释:http://javahungry.blogspot.com/2013/08/hashing-how-hash-map-works-in-java-or.html http://javarevisited.blogspot.com/2011/02/how-hashmap-works-in-java.html