散列映射最初 put/get 是否带有轮询或喜欢的列表?
Do hash-maps initially put/get with polling or liked lists?
我正在使用散列图制作图形函数来存储所有节点。我知道散列是如何工作的,但是对于散列图,我不知道他们是否使用 lin/quad 探测到 put/get 节点,或者它是否是链表。我希望它使用轮询,因为我只希望每个散列有一个节点,而不是链表格式(或任何其他将多个节点散列到同一位置的格式)。这是正常完成的方式还是我需要设置一些值以将链表方法更改为 lin/quad 探测方法。
我基本上想知道我的一个节点是否映射到地图中与前一个节点相同的位置,
是否会用新节点替换旧节点(映射的删除方法),如果不替换则...
它会把它附加到包含两个节点的内存中那个 space 的链表的末尾还是...
它会使用某种类型的轮询方法来获取地图中不包含新节点的新位置吗
我只想在地图中的每个可用位置有一个节点
我指的是 Java 8 中 HashMap
的实现(具体来说是 1.8.0_66-b18)。
HashMap
维持 table 的 Node
s。
当您为键输入一个值时,该键被散列并映射到存储桶(table 中的一个节点),使用 table.length - 1 & hash
作为索引。
如果该索引处没有节点,将创建一个新节点。
如果此索引处有一个节点,则将替换该值(如果我们具有相同的键)或将附加一个新节点。桶被组织为节点结构。首先它是链接list-like,但是如果节点数变得大于某个阈值,它将是"treeified",即转换为tree-like结构。
回答您的问题:
- 不,它不会用新节点替换旧节点。如果这个键已经有一个节点,它的值将被替换。
- 是的,一个新节点将附加到节点结构(链接 list-like 或 tree-like)。链接的 list-like 结构可能会因此转换为 tree-like 结构。
- 没有。将散列映射到 table 的索引是硬编码的。
I am basically wanting to know if one of my nodes maps out to the same place in the map as a previous node
如果不深入研究 HashMap
(私有)的内部结构,您就无法确定这一点。微创大概就是找出HashMap
的table的capacity/length,然后计算每个key的hash值的索引。但是连capacity()
都访问不了。所以这是一个很好的迹象,表明它是一个实现细节,你不应该真的这样做。
您也几乎无法影响是每个存储桶只获得一个节点还是更多。它甚至不是散列冲突,它是 HashMap
为散列计算的索引的冲突。避免这种碰撞的唯一方法是:
- 条目数小于容量并且
- 所有键的哈希给出不同的
table.length - 1 & hash
这很难保证。
我正在使用散列图制作图形函数来存储所有节点。我知道散列是如何工作的,但是对于散列图,我不知道他们是否使用 lin/quad 探测到 put/get 节点,或者它是否是链表。我希望它使用轮询,因为我只希望每个散列有一个节点,而不是链表格式(或任何其他将多个节点散列到同一位置的格式)。这是正常完成的方式还是我需要设置一些值以将链表方法更改为 lin/quad 探测方法。
我基本上想知道我的一个节点是否映射到地图中与前一个节点相同的位置,
是否会用新节点替换旧节点(映射的删除方法),如果不替换则...
它会把它附加到包含两个节点的内存中那个 space 的链表的末尾还是...
它会使用某种类型的轮询方法来获取地图中不包含新节点的新位置吗
我只想在地图中的每个可用位置有一个节点
我指的是 Java 8 中 HashMap
的实现(具体来说是 1.8.0_66-b18)。
HashMap
维持 table 的 Node
s。
当您为键输入一个值时,该键被散列并映射到存储桶(table 中的一个节点),使用 table.length - 1 & hash
作为索引。
如果该索引处没有节点,将创建一个新节点。
如果此索引处有一个节点,则将替换该值(如果我们具有相同的键)或将附加一个新节点。桶被组织为节点结构。首先它是链接list-like,但是如果节点数变得大于某个阈值,它将是"treeified",即转换为tree-like结构。
回答您的问题:
- 不,它不会用新节点替换旧节点。如果这个键已经有一个节点,它的值将被替换。
- 是的,一个新节点将附加到节点结构(链接 list-like 或 tree-like)。链接的 list-like 结构可能会因此转换为 tree-like 结构。
- 没有。将散列映射到 table 的索引是硬编码的。
I am basically wanting to know if one of my nodes maps out to the same place in the map as a previous node
如果不深入研究 HashMap
(私有)的内部结构,您就无法确定这一点。微创大概就是找出HashMap
的table的capacity/length,然后计算每个key的hash值的索引。但是连capacity()
都访问不了。所以这是一个很好的迹象,表明它是一个实现细节,你不应该真的这样做。
您也几乎无法影响是每个存储桶只获得一个节点还是更多。它甚至不是散列冲突,它是 HashMap
为散列计算的索引的冲突。避免这种碰撞的唯一方法是:
- 条目数小于容量并且
- 所有键的哈希给出不同的
table.length - 1 & hash
这很难保证。