0

我正在使用哈希图制作一个图形函数来存储所有节点。我知道散列是如何工作的,但是对于散列图,我不知道他们是否使用 lin/quad 探测来放置/获取节点,或者它是否是一个链表。我希望它使用轮询,因为我只需要每个哈希一个节点,而不是链表格式(或任何其他将多个节点散列到同一位置的格式)。这是正常完成的方式还是我需要设置一些值来将链表方法更改为 lin/quad 探测方法。

我基本上想知道我的一个节点是否映射到地图中与前一个节点相同的位置,

  1. 是否会用新节点替换旧节点(映射的删除方法),如果不替换则...

  2. 它会将其附加到包含两个节点的内存空间中的链表的末尾还是...

  3. 它会使用某种类型的轮询方法来获取地图中不包含新节点的新位置吗

我只想要地图中每个可用位置的一个节点

4

1 回答 1

0

我指的HashMap是 Java 8 中的实现(具体来说是 1.8.0_66-b18)。

HashMap维护一个Nodes 表。

当您为键设置值时,该键被散列并使用 table.length - 1 & hash作为索引映射到存储桶(表中的节点)。

如果该索引处没有节点,则将创建一个新节点。

如果该索引处有一个节点,则该值将被替换(如果我们有相同的键)或将追加一个新节点。存储桶被组织为节点结构。首先它是类似链表的,但是如果节点的数量变得大于某个阈值,它将被“树化”,即转换为树状结构。

要回答您的问题:

  1. 不,它不会用新节点替换旧节点。如果这个键已经有一个节点,它的值将被替换。
  2. 是的,一个新节点将附加到节点结构(链表状或树状)。因此,链表状结构可以转换为树状结构。
  3. 不会。将哈希映射到表的索引是硬编码的。

我基本上想知道我的一个节点是否映射到地图中与前一个节点相同的位置

HashMap如果不深入研究(私有)的内部,您将无法确定这一点。微创可能是找出表的容量/长度HashMap,以及每个键的哈希计算索引。但即使capacity()是不可访问的。所以这是一个很好的迹象,表明它是一个实现细节,你不应该真的这样做。

您也几乎无法影响每个存储桶是否仅获得一个节点或更多。它甚至不是哈希冲突,而是HashMap计算哈希的索引冲突。唯一不会发生这种碰撞的方法是:

  • 条目数小于容量,并且
  • 所有键的散列给出不同的table.length - 1 & hash

这很难保证。

于 2018-04-10T20:51:45.397 回答