Hashing究竟是如何在HashMap中运行的?

时间:2015-04-13 06:11:49

标签: java hash hashmap hashtable

我想知道如何在散列图中完成散列的完整功能?不是理论上的。实际上就是一个例子。

1 个答案:

答案 0 :(得分:0)

看看下面的代码,当我们在地图中插入一对时,它给出了幕后的想法。

public V put(K key, V value) {
    if (key == null)
        return putForNullKey(value);
    int hash = hash(key.hashCode());
    int i = indexFor(hash, table.length);
    for (Entry<K,V> e = table[i]; e != null; e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
            V oldValue = e.value;
            e.value = value;
            e.recordAccess(this);
            return oldValue;
        }
    }

    modCount++;
    addEntry(hash, key, value, i);
    return null;
}

现在,下面的代码显示了如何为字符串计算哈希码。类似地,其他数据类型有自己的实现,您可以在grepcode中检查它。如果您有自定义类,那么哈希代码需要由您专门实现,否则将从默认对象类中获取。

 /**
 * Returns a hash code for this string. The hash code for a
 * <code>String</code> object is computed as
 * <blockquote><pre>
 * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
 * </pre></blockquote>
 * using <code>int</code> arithmetic, where <code>s[i]</code> is the
 * <i>i</i>th character of the string, <code>n</code> is the length of
 * the string, and <code>^</code> indicates exponentiation.
 * (The hash value of the empty string is zero.)
 *
 * @return  a hash code value for this object.
 */
public int hashCode() {
    int h = hash;
    if (h == 0) {
        int off = offset;
        char val[] = value;
        int len = count;

        for (int i = 0; i < len; i++) {
            h = 31*h + val[off++];
        }
        hash = h;
    }
    return h;
}

希望它解释!!!

查看@ grepcode了解更多详情。另请访问此stackoverflow page