当前位置: 首页 > 知识库问答 >
问题:

HashMap中的bucket数是什么意思?

孟福
2023-03-14

我在读Hashmap。

HashMap的实例有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中的桶数。

如果Hashmap中有10个键值对。假设Hashcode是不同的。

每个遗嘱都在一个桶里,对吗?或者一个bucket可以有多个键值对?

因为在英语中的意思是一个很大的东西,其中有许多对象可以驻留。

共有3个答案

狄飞尘
2023-03-14
Bucket with hashcode 1    Bucket with hashcode 2 and similar
  K and V                    K and V
  K and V                    K and V 

因此,密钥的hashCode()决定了kv对进入哪个bucket,在查找时使用相同的hashCode来查找kv对。

hashCode()不应返回常量值。因为这意味着所有的物体都在一个桶里。这与一开始不使用地图是一样的。由于所有的键值对都在同一个bucket中,Java必须遍历所有对象才能找到键。

白刚洁
2023-03-14

在java中,如果你在HashMap中存储一个对象,首先HashMap实现调用hashCode()方法来查找存储桶位置。然后它将键和值存储为条目。NB!它存储键也是因为它在检索对象时至关重要。两个对象可以有相同的hashcode,所以如果发生这种情况,HashMap将使用相同的存储桶位置,并将第二个对象也存储在那里。它内部为此使用了一个链接列表。(不是java.util.链接列表,而是一个更简单的实现)

检索过程中:你有一把钥匙-

编辑:所以你在同一个位置有一个bucket,但是bucket是一个LinkedList,所以它可以存储多个条目。所以bucket的数量是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

欧阳骏俊
2023-03-14

是的,没错,每个桶可以有多个键值对。

对象的hashCode()通过以下表达式确定它进入哪个存储桶:object。hashCode()%n,其中n=桶的总数,%是模运算符。

大多数情况下,对象会很好地分布在桶中,但是你不能保证它们会在哪里。这取决于数据和hashCode函数。

显然,当hashCode实现较差时,hashmap的性能会下降。

还要阅读equals/hashcode合同,这是相关的。

 类似资料:
  • 有两个重要属性:和。我查阅了Java文档,它说是初始加载因子。但我找不到它的实际用途。 有人能描述一下我们需要设置负载因子的不同场景,以及针对不同情况的一些示例理想值是什么吗?

  • 我是javascript的新手。我曾经读过关于SAEF的文章,但我仍然有疑问,代码如下:

  • 我一直在bucket策略示例中看到这种情况,但我不知道它是什么 这是否意味着用户必须添加一个具有“bucket-owner-full-control”值的标头“s3:x-amz-acl”?这是强制执行实际的acl还是任意的?它可以是任何头和字符串,或者S3:X-AMZ-ACL和bucket-owner-full-control有什么意义吗?

  • 问题内容: 我试图在Python 3.3中使用旧的库(可追溯至2003年!)。当我导入它时,Python抛出错误,因为源文件中有符号,例如: 我猜这是该语言现在被放弃的标志。 它到底是什么意思,我应该用哪个(较新的)符号代替? 问题答案: 这意味着不等于。它取自(python的前身)此处: 订单测试(表示 “不等于” ) 我相信它是从Pascal那里获得的,Pascal是Guido开始使用的语言。

  • 问题内容: 我发现此代码可在此处找到SO中的重复项。但我不明白这条线是什么意思 问题答案: 该运算符是Java中无符号的右移位运算符。它有效地将操作数除以右操作数的幂,或者仅在此处。 和之间的差异仅在移动负数时才会显示。如果运算符是a ,则运算符会将其移位到最高有效位,而无论如何都将移位。 更新: 让我们求平均值和()。我们可以轻松地进行数学运算: 现在,通过代码,涉及到以下这些位: 让我们将“转

  • 问题内容: 我已经看到了声明,接口和类 这是什么意思? 问题答案: 没有证据,我相信您在谈论Java的泛型支持… 泛型允许您抽象类型 在Java 5之前,很难提供能够支持多种不同类型的Objects的类而不必为每种特定情况编写代码,因此人们通常会这样做。 这导致在运行时做出许多困难的选择,您必须进行运行时检查以查看是否有可能将给定的Object强制转换为可用类型…例如 现在,这已经很明显了,但是如