2012-04-16 59 views
-4

在java中的HashMap中,我明白散列值存储在存储桶中,这有助于更快地进行搜索。
检索时,它检查散列码并相应地查找存储区编号。

如果存在从1到10的存储区编号,并且从散列代码找到的存储区编号是存储区编号5

控件如何转移到桶号5?它是否穿过桶1到桶4并达到5或者是否使用任何其他机制?Hashmap是否使用随机存取?

+2

您应该阅读http://en.wikipedia.org/wiki/Hashmap ... – 2012-04-16 11:42:10

+2

...或任何有关数据结构的优秀教科书。 – 2012-04-16 11:43:50

+0

你应该把家庭作业标记为这样。 – Viruzzo 2012-04-16 11:44:41

回答

4

散列表是作为一个桶数组实现的,因此它使用数组的random access索引来给出给定散列的右桶。从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); 
     } 

5

它是直接数组访问。没有迭代/遍历。但是它必须遍历内部的对象并与equals比较。也许这让你感到困惑。

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”时,散列函数直接在这里找到桶。

A hash function是哈希映射工作的核心。

0

有几种策略,当添加和检索值,其中一些是直接chaning,开放寻址等 基于这些它存储和取回值的方式将改变。例如,在直接链接每个空间的桶 数组是指向包含哈希到相同位置的键值对的链表的列表。因此,当您搜索该值时,它将使用给定值扫描整个列表。