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