java为什么字典初始化时不会发生内存溢出?
背景:字典使用哈希函数为您输入的每个值生成索引
- 虽然说索引在每个输入中都是唯一的,但我只是 想知道生成的确切哈希函数是什么 每个输入的唯一值李>
- 让我们假设(因为我不确定),存在一个哈希函数,它为每个输入生成唯一的索引。那么字典的初始化大小是多少?我假设它是动态的,但是如果一个索引是10,而另一个输入是123456呢?它必须使用大小为123457的数组-这不会导致内存溢出吗李>
PS:我对什么是哈希函数以及它的作用有理论上的了解,但我还没有看到它的实际实现。而且,由于许多语言都有内置的数据结构,这让我很好奇:)
# 1 楼答案
关于哈希函数唯一性的假设是错误的
例如,如果我们以Java的
HashMap
为例,它使用密钥的hashCode()
并对其应用一个补充的哈希函数(以防止质量差的哈希函数)。然后is获取计算出的散列值,并将其映射到映射存储中的索引,该索引通常比散列值小得多因此,即使哈希函数会为每个键返回一个唯一的值(这不是必需的),
HashMap
仍会将该值规范化为HashMap
存储的更小索引。因此不会出现溢出(只要不在Map
中插入太多元素)