请分享一下java中rehash方法的一些见解?

时间:2015-06-11 10:24:25

标签: java api hash hashtable

我正在寻找关于哈希表/哈希映射数据结构的更好的见解。

通过api,我可以看出内部Entry类被引用为桶。如果我错了,请纠正我。

请找到以下方法: -

  public synchronized V put(K key, V value) {
    // Make sure the value is not null
    if (value == null) {
        throw new NullPointerException();
    }

    // Makes sure the key is not already in the hashtable.
    Entry tab[] = table;
    int hash = hash(key);
    int index = (hash & 0x7FFFFFFF) % tab.length;
    for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
        if ((e.hash == hash) && e.key.equals(key)) {
            V old = e.value;
            e.value = value;
            return old;
        }
    }

    modCount++;
    if (count >= threshold) {
        // Rehash the table if the threshold is exceeded
        rehash();

        tab = table;
        hash = hash(key);
        index = (hash & 0x7FFFFFFF) % tab.length;
    }

    // Creates the new entry.
    Entry<K,V> e = tab[index];  <-------are we assigining null to this entry?
    tab[index] = new Entry<>(hash, key, value, e);
    count++;
    return null;
}

通过以下代码行

Entry<K,V> e = tab[index];

我可以假设我们正在为这个新的条目对象赋值null;请在这里纠正我。

所以我的另一个问题是: -

为什么我们不直接这样做

Entry<K,V> e = null 
 instead  of 
Entry<K,V> e = tab[index];

请在下面找到调试的屏幕截图: - enter image description here

请分享您对此的宝贵见解。

1 个答案:

答案 0 :(得分:2)

Entry<K,V>是一个可以表示链接列表中的链接的实例。请注意,next成员引用列表中的下一个条目。

存储桶包含映射到同一索引的条目的链接列表。

只有在该索引中尚未存储任何条目时,

Entry<K,V> e = tab[index]才会返回null。否则,它将返回该存储桶链接列表中的第一个条目。

tab[index] = new Entry<>(hash, key, value, e);创建一个新条目并将其存储为存储桶中的第一个条目。前一个Entry被传递给Entry构造函数,以便成为列表中的下一个(第二个)条目。