1.第一次加入元素的时候
一开始table为null,第一次调用put方法放入元素的时候,会调用resize来初始化table。
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable {
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {
Node<K,V>[] tab; Node<K,V> p; int n, i;
//如果table为null
if ((tab = table) == null || (n = tab.length) == 0){
n = (tab = resize()).length;
}
}
}
2.添加完一个元素
添加完元素,size+1,然后判断size是不是大于threshold,如果大于的话,就执行resize。
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable {
/**
* The number of key-value mappings contained in this map.
*/
transient int size;
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
if (++size > threshold){
resize();
}
}
}
3.转换为红黑树的时候
- put元素到map后,如果发现所在桶的链表长度大于等于8,会调用treeifyBin尝试去转换成红黑树;
- 如果发现table的length小于64,那就会去扩容,而不会转换成红黑树;
//MIN_TREEIFY_CAPACITY:64
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable {
final void treeifyBin(Node<K,V>[] tab, int hash) {
int n, index; Node<K,V> e;
if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY){
resize();
}
}
}
3.总结
- table为null,初始化table,调用的resize()方法;
- 添加一个元素后,如果所在桶的链表长度大于等于8,会看table的length是不是小于64,如果小于64,则调用resize();
- 添加一个元素后,size大于threshold,调用resize()方法;