码迷,mamicode.com
首页 > 其他好文 > 详细

HashMap

时间:2020-01-05 00:07:59      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:col   一个   ++   次数   现在   als   相同   eval   span   

 

 

HashMap putVal
 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     }

HashMap

标签:col   一个   ++   次数   现在   als   相同   eval   span   

原文地址:https://www.cnblogs.com/seeseabky/p/12150752.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!