网站首页样式医院做网站的好处
网站首页样式,医院做网站的好处,医疗公司网站建设项目背景,网站建设的过程有哪些文章目录
一、put方法运行流程图
二、put方法源码分析
三、总结 相关文章 HashMap 扩容机制 一、put方法运行流程图 二、put方法源码分析 public V put(K key, V value) {return putVal(hash(key), key, value, false, true);}final V putVal(int hash, K key, V value, …文章目录一、put方法运行流程图二、put方法源码分析三、总结相关文章HashMap 扩容机制一、put方法运行流程图二、put方法源码分析publicVput(K key, V value){returnputVal(hash(key), key, value,false,true); }finalVputVal(inthash, K key, V value,booleanonlyIfAbsent,booleanevict){ NodeK,V[] tab; NodeK,V p;intn, i;// 判断数组是否未初始化if((tab table) null|| (n tab.length) 0)// 未初始化调用resize()方法进行初始化操作n (tab resize()).length;// 通过 计算出该数据key的数组下标并判断该下标位置是否有数据if((p tab[i (n -1) hash]) null)// 如果没有直接将数据放在该下标位置tab[i] newNode(hash, key, value,null);else{// 该数组下标有数据的情况NodeK,V e; K k;// 判断该位置数据的key是否和待插入Key匹配if(p.hash hash ((k p.key) key || (key !null key.equals(k))))/* * 如果一样证明为修改操作该节点的数据赋值给e,后面会用 * 注 * 变量 e 是 NodeK,V 类型用于存储匹配到的旧节点 * 若 e ! null说明 Key 已存在后续会覆盖旧值若 e null说明 Key 不存在会新增节点 * */e p;elseif(pinstanceofTreeNode)// 判断是否为红黑树// 如果为红黑树执行红黑树的操作e ((TreeNodeK,V)p).putTreeVal(this, tab, hash, key, value);else{// 待插入的key与当前位置数据的key不相同也不是红黑树节点则为链表// 遍历链表for(intbinCount0; ; binCount) {// 判断next节点如果为空的话证明遍历到链表尾部了if((e p.next) null) {// 把新值放入到链表尾部p.next newNode(hash, key, value,null);// 因为插入了一条数据所以判断链表长度是不是大于等于8if(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; } }// 判断e是否为空变量 e 是 NodeK,V 类型用于存储匹配到的旧节点if(e !null) {// existing mapping for key// 不为空的话证明是修改操作取出旧值VoldValuee.value;// 一定会执行因为onlyIfAbsent 传进方法来的是falseif(!onlyIfAbsent || oldValue null)// 将新值赋值当前节点e.value value; afterNodeAccess(e);// 返回旧值returnoldValue; } }// 计数器计算当前节点的修改次数modCount;// 当前数组中的数据数量如果大于扩容阈值if(size threshold)// 进行扩容操作resize();// 一个空方法方法中无代码afterNodeInsertion(evict);// 添加操作时返回空值returnnull; }三、总结判断键值对数组table是否为空或为null否则执行resize()进行扩容初始化操作根据键值key计算hash值得到数组索引判断table[i]null条件成立直接新建节点添加如果table[i]null不成立判断table[i]的首个元素是否和key一样如果相同直接覆盖value判断table[i]是否为treeNode即table[i]是否为红黑树如果是红黑树则直接在树中插入键值对遍历table[i]链表的尾部插入数据然后判断链表长度是否大于8大于8则把链表转换为红黑树在红黑树中执行插入操作遍历过程中若发现key已经存在直接覆盖value注当然转换红黑树还要数组的容量64put方法源码判断大于8会执行 treeifyBin方法在treeifyBin方法中会判断数组长度小于64会执行扩容操作插入成功后判断实际存在的键值对数量size是否超多了最大容量threshold数组长度*0.75如果超过进行扩容