【问题标题】:What is bucket used in hashing, with reference to a memory location?参考内存位置,散列中使用的存储桶是什么?
【发布时间】:2017-07-17 22:15:38
【问题描述】:

在 HashMap 或任何使用散列技术的地方,都会在对象上调用 hashcode 方法,以计算用于查找存储 Entry 对象的桶的散列。

hascode() 方法返回的值不是内存位置。那么bucket的概念到底是什么?参考内存位置?

如果它是一个单独的内存位置,那么如何在其中保存 Map 条目的链表?

我在堆栈中发现了类似的问题,但没有一个清楚地解释桶的真正含义。请帮我理清桶的概念。

【问题讨论】:

  • @EJP 我没有说Java中有内存位置。我指的是存储所有值的内存位置

标签: java hash collections hashmap hashcode


【解决方案1】:

哈希表中的桶只不过是一个数组索引(在大多数情况下)。

您的哈希函数将始终返回您需要放置对象的数组的索引(或根据要求执行任何操作本身)。所以要了解内存是如何管理的,就需要了解数组是如何分配内存的。

它们被赋予连续的内存位置,以确保对任何索引的动态访问都能完美运行。

什么是哈希表返回相同的索引

然后您可以将该索引指向一个链表或另一个数组以存储更多值。

当访问这些值时,您可以简单地在恒定时间内从哈希函数访问所需的索引,如果该索引包含多个值,您可以假设索引指向一个链表来遍历这些值。

在这种情况下,链接列表将位于单独的位置。该位置的起始地址将由该数组索引指向。

【讨论】:

  • 谢谢。我在一次采访中被问到这个问题,我对存储桶是一个内存位置感到困惑。现已清除
【解决方案2】:

在散列中,hashcode() 的值决定了桶的索引。许多对象可能具有相同的 hashcode() 值。在这种情况下,所有此类对象都将映射到同一个存储桶。

理论上,桶可以被想象为所有此类对象的容器。它可以以各种方式实现。它在“HashMap”实现中被实现为一个简单的链表。这意味着,存储桶被实现为链表。我们可以想象每个桶都是一个链表。

例如,如果一个bucket中有3个对象(A,B,C),bucket可以可视化为链表A->B->C->null

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-25
    • 2013-04-24
    • 2017-04-18
    • 1970-01-01
    • 2020-01-31
    • 2020-07-18
    • 2021-10-17
    相关资源
    最近更新 更多