为什么字典初始化时不会发生内存溢出?

时间:2014-11-26 06:22:36

标签: java c# dictionary data-structures hash

后台:词典使用哈希函数为您输入的每个值生成索引。

  1. 虽然在每次输入的情况下索引都是唯一的,但我只是 想知道什么可能是生成的确切的Hash函数 每个输入的唯一值?
  2. 让我们假设(因为我不确定),存在一个哈希函数,它为每个输入生成唯一索引。那么字典将被初始化的大小是多少?我假设它是动态的,但如果一个索引是10而另一个输入是123456怎么办?它必须使用大小为123457的数组 - 不会导致内存溢出?
  3. PS:我对哈希函数是什么以及它的作用有了理论知识,但我还没有看到它的实际实现。此外,由于许多语言都有内置的数据结构用于此目的,它让我很好奇:)

1 个答案:

答案 0 :(得分:2)

关于哈希函数的唯一性的假设是错误的。

如果我们采用Java的HashMap,它使用密钥的hashCode()并在其上应用补充哈希函数(以防御质量差的哈希函数)。然后获取计算的哈希值并将其映射到地图存储中的索引,该索引通常比哈希值小得多。

因此,即使散列函数会为每个键返回一个唯一值(它不是必需的),HashMap仍会将该值规范化为{{1的存储索引的小得多的索引}}。因此,没有溢出(只要您不在HashMap中插入太多元素)。