在Java中的HashMap中,我理解哈希值存储在桶中,这有助于更快的搜索。
在检索时,它检查哈希码并相应地找到桶号。
如果存在从1到10的铲斗编号,并且从哈希码中找到的铲斗编号是铲斗编号5
。
如何将控制转移到铲斗编号5 ?它是否通过桶1到达桶4并达到5或者是否使用任何其他机制?
答案 0 :(得分:5)
这是直接阵列访问。没有迭代/遍历。但是它必须遍历桶中的 对象并与equals
进行比较。也许这让你感到困惑。
答案 1 :(得分:5)
哈希表是作为桶数组实现的,因此它使用数组的random access索引来获取给定哈希值的正确存储桶。
答案 2 :(得分:3)
哈希函数用于定位存储桶。
如果有10个桶,让我们举例说,对于一组字符串,将字符值添加并散列到10个桶
让我们编写一个简单的哈希函数来将字符串映射到10个桶中,
For any non empty String,
hash function f = sum of (index of characters) % 10
示例:abc = 1 + 2 + 3%10 = 6.因此“abc”在第6个桶中结束。 xyz = 24 + 25 + 25%10 = 7.5~8。因此,“xyz”最终会出现在第8个桶中,依此类推
因此,当您搜索“xyz”时,哈希函数会直接在此处找到存储桶。
hash function是哈希映射工作的核心。
答案 3 :(得分:2)
摘自java.util.HashMap代码
/**
* Adds a new entry with the specified key, value and hash code to
* the specified bucket. It is the responsibility of this
* method to resize the table if appropriate.
*
* Subclass overrides this to alter the behavior of put method.
*/
void addEntry(int hash, K key, V value, int bucketIndex) {
Entry<K,V> e = table[bucketIndex];
table[bucketIndex] = new Entry<>(hash, key, value, e);
if (size++ >= threshold)
resize(2 * table.length);
}
因此可以从数组中随机访问。
答案 4 :(得分:0)
添加和检索值时有几种策略,其中一些是直接转换,开放寻址等 基于这些,它存储和获取值的方式将发生变化。例如,直接链接桶的每个空间 array是指向链接列表的指针,该链接列表包含散列到同一位置的键值对。因此,当您搜索该值时,它将使用给定值扫描整个列表。