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

hashmap中的indexFor?[复制]

仰雅昶
2023-03-14

只是想通过查看代码来了解Java HashMap的工作原理。添加元素时,会发生以下情况:

  1. 密钥的hashcode已获取
  2. 哈希函数应用于结果
  3. 方法indexFor应用于2的结果。这给出了相应桶中的第一个条目。然后循环遍历桶中的链表-找到结尾并添加元素。

indexOf的实施是:

int indexOf(int h, int length) {
     return h & (length-1);
}

我不明白indexOf方法中的诀窍。有人能解释一下吗?

谢谢

共有1个答案

司空海荣
2023-03-14

这是因为JavaHashMaps总是有一个容量,即桶的数量,是2的幂。让我们使用256的容量,也就是0x100,但它可以使用任何2的幂。从2的幂中减去1得到按位和哈希所需的精确位掩码,以获得适当的桶索引,范围为0长度-1

256 - 1 = 255
0x100 - 0x1 = 0xFF

例如,一个257(0x101)的散列按位与0xFF进行AND运算,得到一个1的桶数。

 类似资料:
  • 可能的重复: 通过JavaScript对象循环 获取对象键的数组 有没有方法在JavaScript中使用hashmaps。我找到了这个页面,它展示了在JavaScript中使用hashmaps的一种方法。基于此,我将数据存储如下: 但是我想要对象的键集(所有键),就像在Java()中那样。 谁能给我演示一下如何获得这个对象中存在的所有键?

  • 可能重复: HashMap#hash(int)方法的解释 有人能详细解释一下这个方法吗,谢谢。

  • 问题内容: 在尝试时,我发现有些奇怪。 运行4个线程,每个线程尝试使用0到9999之间的键放置(键,值),并给一个常量字符串赋值。完成所有线程后,返回大于10,000的值。这怎么发生的?这是否意味着地图包含重复的键? 我在上进行了迭代,发现某些键的数量确实大于1。如果我在地图上对一个这样的键进行操作,将会返回什么值。 这是我尝试过的代码 问题答案: 如链接文档中明确指出的那样,它不是线程安全的。您

  • 问题内容: 我需要制作一个副本,`HashMap<Integer, List List List `原件中。 如果我正确理解,这两种方法只会创建浅拷贝,这不是我想要的: 我对吗? 除了遍历所有键和所有列表项并手动复制之外,还有更好的方法吗? 问题答案: 没错,浅表副本不能满足您的要求。它将具有原始地图中的副本,但这些副本将引用相同的对象,因此对from 的修改将出现在from的对应内容中。 在Ja

  • 问题内容: 我当时想将Double用作HashMap的键,但是我知道浮点比较并不安全,这让我开始思考。Double类上的equals方法是否还不安全?如果是,那将意味着hashCode方法也可能不正确。这意味着使用Double作为HashMap的键将导致不可预测的行为。 有人可以在这里确认我的任何猜测吗? 问题答案: 简短答案: 请勿这样做 长答案: 这是密钥的计算方式: 实际的键将是一个对象,因

  • 问题内容: 我想在hashmap上添加重复的元素 所以: 我该怎么做? 问题答案: 使用ie将字符串映射到整数列表。 因此,在这种情况下,将映射到[1,3,3]的列表。 显然,您必须编写自己的put方法,在其中将int添加到列表中。例: