参考内存位置,散列中使用的存储区是什么?

时间:2017-02-27 10:30:45

标签: java hash collections hashmap hashcode

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

hascode()方法返回的值不是内存位置。那么参考内存位置的桶的概念究竟是什么呢?

如果它是单个内存位置,那么如何在那里保存Map条目的链接列表呢?

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

2 个答案:

答案 0 :(得分:2)

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

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

为它们提供连续的内存位置,以确保对任何索引的动态访问都能正常工作。

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

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

访问这些值时,您可以在常量时间内从哈希函数中简单地访问所需的索引,如果该索引包含多个值,则可以假设索引指向链接列表来迭代这些值。

此案例中的链接列表将位于单独的位置。该位置的起始地址将由该数组索引指向。

答案 1 :(得分:1)

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

理论上,桶可以被想象成所有这些物体的容器。它可以以各种方式实现。它在" HashMap"中实现为一个简单的链表。实现。这意味着,bucket实现为链表。我们可以想象每个桶都是一个链表。

例如,如果存储桶中有3个对象(A,B,C),则可以将存储桶显示为链接列表A-> B-> C-> null