标签:col 一个 ++ 次数 现在 als 相同 eval span
1 final V putVal(int hash, K key, V value, boolean onlyIfAbsent, 2 boolean evict) { 3 HashMap.Node<K, V>[] tab;//局部变量存放table,进行扩容存在线程安全问题。 4 HashMap.Node<K, V> p;//临时的node用作数据转换 5 int n;//tab的长度 6 int i; 7 8 //如果tab是null,或者大小为0 9 //tab进行扩容 10 if ((tab = table) == null || (n = tab.length) == 0) 11 n = (tab = resize()).length; 12 //找到key对应的tab的位置,如果是null 13 if ((p = tab[i = (n - 1) & hash]) == null) 14 //创建node让如对应的tab中 15 tab[i] = newNode(hash, key, value, null); 16 //如果对应的tab已经有node对象 17 else { 18 HashMap.Node<K, V> e; 19 K k; 20 21 //node的hash与key的hash相等并且node的key和key内存地址或者值相同。 22 if (p.hash == hash && 23 ((k = p.key) == key || (key != null && key.equals(k)))) 24 //把现有的node赋值给e 25 e = p; 26 //如果现在的node是红黑树。 27 else if (p instanceof HashMap.TreeNode) 28 //将对应的key和value放入红黑树中。 29 e = ((HashMap.TreeNode<K, V>) p).putTreeVal(this, tab, hash, key, value); 30 else { 31 //遍历链表 32 for (int binCount = 0; ; ++binCount) { 33 //到达尾部 34 if ((e = p.next) == null) { 35 //创建key,value的node放到链表尾部。 36 p.next = newNode(hash, key, value, null); 37 //如果链表的长度大于等于阈值-1 38 if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st 39 //链表转红黑树 40 treeifyBin(tab, hash); 41 //执行完退出循环 42 break; 43 } 44 45 //找到node的key的hash与key的hash相等并且node的key和key内存地址或者值相同。 46 if (e.hash == hash && 47 ((k = e.key) == key || (key != null && key.equals(k)))) 48 //满足条件退出循环。 49 break; 50 51 //继续判断下一个node值,将e赋值给p 52 p = e; 53 } 54 } 55 //map中存在对应的key 56 if (e != null) { 57 V oldValue = e.value; 58 if (!onlyIfAbsent || oldValue == null) 59 //把原有的值覆盖 60 e.value = value; 61 62 //hashmap用不到这个方法 63 afterNodeAccess(e); 64 return oldValue; 65 } 66 } 67 68 //记录map修改值得次数 69 ++modCount; 70 71 //如果map的key的数量大于阈值-1时,进行扩容。 72 if (++size > threshold) 73 //扩容 74 resize(); 75 //hashmap用不到这个方法 76 afterNodeInsertion(evict); 77 return null; 78 }
标签:col 一个 ++ 次数 现在 als 相同 eval span
原文地址:https://www.cnblogs.com/seeseabky/p/12150752.html