Hashmap是否使用随机访问?

时间:2012-04-16 11:39:04

标签: java hashmap

在Java中的HashMap中,我理解哈希值存储在桶中,这有助于更快的搜索。
在检索时,它检查哈希码并相应地找到桶号。

如果存在从1到10的铲斗编号,并且从哈希码中找到的铲斗编号是铲斗编号5

如何将控制转移到铲斗编号5 ?它是否通过桶1到达桶4并达到5或者是否使用任何其他机制?

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是指向链接列表的指针,该链接列表包含散列到同一位置的键值对。因此,当您搜索该值时,它将使用给定值扫描整个列表。