java hash map源码分析之 v put(k,v)
通过put方法了解hashmap的结构
###1. hashmap的主要成员变量table
transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_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);
- 通过key,计算对应hash值;
- 通过1所得hash值,计算key所在位置。
找到位置后需要处理在该位置的冲突,即,遍历该位置的链表,找到key的对应节点。(for循环中的内容)
合理的数据结构,放到合适的位置,即使是顺序遍历。。。。