Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hashmap如何确保在哈希表中为每个哈希值分配唯一的索引_Java_Collections_Hashmap - Fatal编程技术网

Java hashmap如何确保在哈希表中为每个哈希值分配唯一的索引

Java hashmap如何确保在哈希表中为每个哈希值分配唯一的索引,java,collections,hashmap,Java,Collections,Hashmap,我想了解HashMap的hash()和indexOf()方法如何将哈希表中的唯一索引分配给HashMap。换句话说,为什么不能将多个散列值映射到同一个索引。在HashMap中,基础存储桶数组大小在初始化时设置,并且可以相应地调整大小-项的存储桶索引(在indexFor中)由key.hashCode()%(table.length-1)生成 hashmap如何确保在哈希表中为每个哈希值分配唯一的索引 不必是唯一的(见下文) 为什么不可能将多个哈希值映射到同一索引 这是可能的-可以将多个条目(键/值

我想了解HashMap的hash()和indexOf()方法如何将哈希表中的唯一索引分配给HashMap。换句话说,为什么不能将多个散列值映射到同一个索引。

HashMap
中,基础存储桶数组大小在初始化时设置,并且可以相应地调整大小-项的存储桶索引(在
indexFor
中)由
key.hashCode()%(table.length-1)
生成

hashmap如何确保在哈希表中为每个哈希值分配唯一的索引

不必是唯一的(见下文)

为什么不可能将多个哈希值映射到同一索引


这是可能的-可以将多个
条目
(键/值对)映射到单个
存储桶
。适当的哈希表实现通过使每个
bucket
能够容纳多个
条目来克服这一问题
HashMap
特别使用链接列表-如果某个项目映射到已占用的
存储桶
,则该项目将添加到存储桶链接列表的开头

它们可以映射到同一个索引,但是
HashMap
存储给定索引的值列表。这称为哈希冲突,并且总是发生。@LuiggiMendoza:我的意思是,如果hashcode是2,并且映射到索引1,为什么hashcode不可能是3,并且映射到与哈希代码2相同的索引1呢,它将生成一个哈希冲突,映射的实现将处理该冲突。两个词回答标题:它不会。虽然Java的
HashMap
实现确实使用链表来解决冲突,但并非所有基于哈希的字典都是这样。(考虑到这个问题是java标记的,所以答案仍然正确。)为了完整起见,当冲突率超过预设值时,java(以及大多数其他)对HashMap的实现将扩展映射表。@bdares,谢谢。我认为我的编辑和你的评论有冲突(编辑时使用了更通用的描述,正如你对缺少描述的评论一样)。@copeg:一个bucket引用表中的一个索引和一个唯一的哈希值是否正确@user2599052,一个bucket是基础表中的一个索引-该bucket可以包含多个项。简单的例子:考虑一个长度为5的表:如果两个密钥的散列值为1和25,它们的索引将是1% 4和25% 4,或者1,1。相同的索引,并按顺序放入该索引的项目列表中。@copeg:您的上一个示例澄清了这个疑问。所以我们可以说,如果散列值被认为是桶数的模,那么一个桶持有一个特定的散列值?