Skip to content

Instantly share code, notes, and snippets.

@pk13610
Last active December 28, 2015 22:18
Show Gist options
  • Save pk13610/7570182 to your computer and use it in GitHub Desktop.
Save pk13610/7570182 to your computer and use it in GitHub Desktop.

java hash map源码分析之 v put(k,v)

通过put方法了解hashmap的结构

###1. hashmap的主要成员变量table

transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;

简单的说:table是Entry链表的数组。如图: hashmap.table

###2. 关于put方法: 代码如下:

    public V put(K key, V value) {
        if (table == EMPTY_TABLE) {
            inflateTable(threshold);
        }
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key);
        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;
    }

找到Key在table中的位置,即Key得hash位置,需要两步走:

        int hash = hash(key);
        int i = indexFor(hash, table.length);
  1. 通过key,计算对应hash值;
  2. 通过1所得hash值,计算key所在位置。

找到位置后需要处理在该位置的冲突,即,遍历该位置的链表,找到key的对应节点。(for循环中的内容)


合理的数据结构,放到合适的位置,即使是顺序遍历。。。。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment