[] tab; Node p; int n, i;//获取长度并进行扩容 , 使用的是懒加载 , table一开始是没有加载的 , 等put后才开始加载if ((tab = table) == null || (n = tab.length) == 0)n = (tab = resize()).length;//如果计算出的该哈希值的位置没有值 , 则把新插入的key-value放到此处 , 此处就算没有插入成功 , 也就是发生哈希冲突时也会把哈希桶的首节点赋予pif ((p = tab[i = (n - 1)//发生哈希冲突的几种情况else {//e 临时节点的作用 , k存放当前节点的keyNode e; K k;//第一种 , 插入当前key-value的hash值 , key都与当前节点的相等 , e=p , 则表示为首节点if (p.hash == hash//第二种 , hash值不等于首节点 , 判断p是否属于红黑树的节点else if (p instanceof TreeNode)//是红黑树的节点 , 则在红黑树中进行添加 , 如果该节点已经存在 , 则返回该节点(不为null) , 该值很重要 , 用来判断put操作是否成功 , 如果添加成功返回nulle = ((TreeNode)p).putTreeVal(this, tab, hash, key, value);//第三种hash值不等于首节点 , 不为红黑树的节点 , 则为链表的节点 。else {//遍历该链表for (int binCount = 0; ; ++binCount) {//如果找到尾部 , 则表明添加的key-value没有重复 , 在尾部进行添加if ((e = p.next) == null) {p.next = newNode(hash, key, value, null);//判断是否要转换为红黑树结构if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1sttreeifyBin(tab, hash);break;}//如果链表中有重复的key , e则为当前重复的节点 , 结束循环if (e.hash == hashp = e;}}//有重复的key , 则用待插入值进行覆盖 , 返回旧值if (e != null) { // existing mapping for keyV oldValue = http://kandian.youth.cn/index/e.value;if (!onlyIfAbsent || oldValue == null)e.value = value;afterNodeAccess(e);return oldValue;}}//到了此步骤 , 则表明待插入的key-value是没有key的重复 , 因为插入成功e节点的值为null//修改次数+1++modCount;//实际长度+1 , 判断是否大于临界值 , 大于则扩容if (++size> threshold)resize();afterNodeInsertion(evict);//添加成功return null;} 上面是元素的添加 , 这里面涉及到了扩容 , 我们来看看扩容方法resize()
final Node[] resize() {//把没插入之前的哈希数组做我诶oldTalNode[] oldTab = table;//old的长度int oldCap = (oldTab == null) ? 0 : oldTab.length;//old的临界值int oldThr = threshold;//初始化new的长度和临界值int newCap, newThr = 0;//oldCap > 0也就是说不是首次初始化 , 因为hashMap用的是懒加载if (oldCap > 0) {//大于最大值if (oldCap >= MAXIMUM_CAPACITY) {//临界值为整数的最大值threshold = Integer.MAX_VALUE;return oldTab;}//标记## , 其它情况 , 扩容两倍 , 并且扩容后的长度要小于最大值 , old长度也要大于16else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY}/**如果oldCap<0 , 但是已经初始化了 , 像把元素删除完之后的情况 , 那么它的临界值肯定还存在 ,如果是首次初始化 , 它的临界值则为0**/else if (oldThr > 0)newCap = oldThr;//首次初始化 , 给与默认的值else {newCap = DEFAULT_INITIAL_CAPACITY;//临界值等于容量*加载因子newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);}//此处的if为上面标记##的补充 , 也就是初始化时容量小于默认值16的 , 此时newThr没有赋值if (newThr == 0) {//new的临界值float ft = (float)newCap * loadFactor;//判断是否new容量是否大于最大值 , 临界值是否大于最大值newThr = (newCap < MAXIMUM_CAPACITY}//把上面各种情况分析出的临界值 , 在此处真正进行改变 , 也就是容量和临界值都改变了 。threshold = newThr;//表示忽略该警告@SuppressWarnings({"rawtypes","unchecked"})//初始化Node
推荐阅读
-
-
-
沐若清辰|明星公司奇葩名字:沈腾的大气,郭德纲太随便,何炅容易让人想歪
-
清柚|逾300万吨糖待发运,巴西桑托斯港口阻塞加剧
-
领导让你做这六件事,说明是真的信任你,抓住机会,事后能升职
-
「疫情防控」通辽发通告,举报重点人员经核实为疑似病例的奖励10000元,确诊病例的追加奖励至20000元
-
『小新文化杂谈』满满夏日性感活力,吴宣仪的露脐装搭配超短裤
-
「快科技」华为Mate30系列上线快速切换应用手势:多任务效率大增
-
经济日报-中国经济网|2020年9月份居民消费价格同比上涨1.7%
-
叶罗丽|叶罗丽:金茉CP正片秀恩爱,导演线下放金罗CP图,金王妃又要换吗
-
化妆护肤女王企业|蓝盈莹李现恋情曝光?这次终于真相大白了!
-
几乎都让它具体|获泰王爱怜,得新首饰作奖励,动图看诗妮娜回宫首秀:弱小又无助
-
「好软推荐」免费强大又好用的解压缩软件及看图图片浏览软件
-
-
-
「北约」北约第30个成员国诞生!此国为加入北约,不惜改变国家的名字
-
绮旋聊旅游|被称为“巧克力城”,每年出生许多混血儿童,中国黑人最多的城市
-
复旦女学生简历照片惹争议,穿着暴露应聘文秘,校方做出回应
-
-
利市|逾200家减持公告!本周减持频现,36股新抛出大额减持计划