所以我理解哈希映射使用桶和哈希码,什么不是。根据我的经验,Java哈希码通常不小,但通常是大数字,所以我认为它没有在内部编入索引。除非哈希码质量差,导致大小相等的桶长度和数量桶,是什么使得哈希映射比名称 - >值对列表更快?
答案 0 :(得分:2)
我查看了Java实现,发现它有点类似于模数,这对于减少数组大小非常有意义。这允许O(1)访问使HashMaps变得更好。
答案 1 :(得分:1)
Hashmaps通过使用哈希函数将元素映射到“桶”来工作。当有人试图插入元素时,会计算哈希码,并对哈希码应用模数运算,以获得应插入元素的桶索引(这就是为什么哈希码有多大并不重要)。例如,如果你有4个桶并且你的哈希码是40,那么它将被插入到桶0中,因为40 mod 4是0。
当两个元素映射到同一个存储桶时,会发生“冲突”,通常该元素存储在同一存储桶下的列表中。
如果尝试获取元素,则使用散列函数再次映射键。如果存储桶包含元素列表,则使用equals()函数来识别哪个元素是正确的(这就是为什么必须实现equals()和hashcode()以将自定义对象插入到hashmap中的原因)。
因此,如果您搜索一个元素,并且您的hashmap在存储桶上没有任何列表,则您的成本为O(1)。最糟糕的情况是,当你只有一个桶和一个包含所有元素的列表时,获取元素与在列表O(N)上搜索相同。