HashMap 是基于hashing的原理,咱们能够通过put()和get()办法贮存和获取对象。当咱们将键值对传递给put()办法时,它计算并取得键的hash值(并进一步获取索引地位),获取Map数组中的索引地位,判断是否该地位是否存在元素,
1、不存在则会从新创立一个,
2、否则的话判断以后节点的key是否与存入雷同则获取该node用于替换value
3、该节点的key不同,则遍历:
如果是该节点的不是链表而是红黑树则遍历该树(当链表的值超过8则会转红黑树)
如果是该节点的是链表

if ((tab = table) == null || (n = tab.length) == 0)n = (tab = resize()).length;//以后数组总长度-1和hash值与运算计算索引地位if ((p = tab[i = (n - 1) & hash]) == null)//从新创立一个节点,最初一个参数null,指该节点仅有一个存储对象else {Node<K,V> e; K k;//否则的话判断以后节点的key是否与存入雷同if (p.hash == hash &&    ((k = p.key) == key || (key != null && key.equals(k))))    e = p;else if (p instanceof TreeNode)    e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);else {    for (int binCount = 0; ; ++binCount) {        if ((e = p.next) == null) {            p.next = newNode(hash, key, value, null);            if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1sttreeifyBin(tab, hash);            break;        }        if (e.hash == hash &&            ((k = e.key) == key || (key != null && key.equals(k))))            break;        p = e;    }}//如果存在雷同的key则替换if (e != null) { // existing mapping for keyV oldValue = e.value;    if (!onlyIfAbsent || oldValue == null)        e.value = value;    afterNodeAccess(e);    return oldValue;}}

jdk 1.8 退出红黑树村粗构造,即 当数组节点对应的链表长度大于8时,则主动转换成红黑出存储,当链表的值小于6则会从红黑树转回链表 以晋升效率