hash冲突
源码:1.8
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
Node<K,V>[] tab; Node<K,V> p; int n, i;
if ((tab = table) == null || (n = tab.length) == 0)
//首次进入直接进行扩容
n = (tab = resize()).length; //resize 扩容 扩容的时候创建数组
if ((p = tab[i = (n - 1) & hash]) == null)
当前位置为空
//1.7中计算存放位置
// static int indexFor(int h, int length) {
// return h & (length-1);
// }
//经过这种算法 i = (n - 1) & hash 得到当前位置
tab[i] = newNode(hash, key, value, null);
else {
当前位置为不为空 此时开始形成链表
Node<K,V> e; K k;
if (p.hash == hash &&
哈希值相等
((k = p.key) == key || (key != null && key.equals(k))))
内容相等
e = p;
第二次: 将 p 给 e
p是需要插入的 e是内部定义的
else if (p instanceof TreeNode) //是否为红黑树
e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
else {