zoukankan      html  css  js  c++  java
  • Java_HashMap的工作原理(Jdk1.8)

    转载自:https://blog.csdn.net/qq_28051453/article/details/52622068

     

     

     

     

     

     

     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数组为空或者长度为0,则进行扩容
           if ((tab = table) == null || (n = tab.length) == 0)
                n = (tab = resize()).length;
            //根据hash算法算出存储的下标,如果为空,即不发生碰撞,则直接存储
           if ((p = tab[i = (n - 1) & hash]) == null)
                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;
                //存储为树
               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);
                            //如果链上的结点大于</span><span style="font-size:14px;">REEEIFY_THRESHOLD(默认为8),则转化为红黑树
                           if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                                treeifyBin(tab, hash);
                            break;
                        }
                   if (e.hash == hash &&
                 ((k = e.key) == key || (key != null && key.equals(k))))
                    break;
                    p = e;
                    }
                }
                if (e != null) { // existing mapping for key
                    V oldValue = e.value;
                    if (!onlyIfAbsent || oldValue == null)
                        e.value = value;
                    afterNodeAccess(e);
                    return oldValue;
                }
            }
            ++modCount;
            if (++size > threshold)
                resize();
            afterNodeInsertion(evict);
            return null;
        }
    ————————————————
    版权声明:本文为CSDN博主「南瓜灯cc」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_28051453/article/details/52622068

     

     

     

     

  • 相关阅读:
    hdu 1269 迷宫城堡 (并查集)
    hdu 1272 小希的迷宫 (深搜)
    hdu 1026 Ignatius and the Princess I (深搜)
    hdu 1099 Lottery
    hdu 1068 Girls and Boys (二分匹配)
    几个基础数位DP(hdu 2089,hdu 3555,uestc 1307 windy 数)
    hdu 1072 Nightmare (广搜)
    hdu 1398 Square Coins (母函数)
    hdu 1253 胜利大逃亡 (深搜)
    hdu 1115 Lifting the Stone (求重心)
  • 原文地址:https://www.cnblogs.com/Yi-ling/p/14511315.html
Copyright © 2011-2022 走看看