
hashMap
寻梦太极
相信技术
展开
-
JDK8:HashMap源码解析:TreeNode类的treeify方法
一、概述treeify方法是TreeNode类的一个实例方法,通过TreeNode对象调用,实现该对象打头的链表转换为树结构。二、方法解析/** * 参数为HashMap的元素数组 */final void treeify(Node<K,V>[] tab) { TreeNode<K,V> root = null; // 定义树的根节点 f...转载 2019-09-20 11:07:00 · 427 阅读 · 0 评论 -
JDK8:HashMap源码解析:TreeNode类的balanceInsertion方法
一、概述balanceInsertion指的是红黑树的插入平衡算法,当树结构中新插入了一个节点后,要对树进行重新的结构化,以保证该树始终维持红黑树的特性。关于红黑树的特性:性质1. 节点是红色或黑色。性质2. 根节点是黑色。性质3 每个叶节点(NIL节点,空节点)是黑色的。性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)...转载 2019-09-26 12:23:17 · 170 阅读 · 0 评论 -
JDK8:HashMap源码解析:remove方法、removeNode方法
一、概述在HashMap中如果要根据key删除这个key对应的键值对,需要调用remove(key)方法,该方法将会根据查找到匹配的键值对,将其从HashMap中删除,并且返回键值对的值。二、方法解析我们先来看remove方法/*** 从HashMap中删除掉指定key对应的键值对,并返回被删除的键值对的值* 如果返回空,说明key可能不存在,也可能key对应的值就是null...转载 2019-09-26 12:23:25 · 392 阅读 · 0 评论 -
JDK8:HashMap源码解析:TreeNode类的putTreeVal方法
一、概述我们都知道,目前HashMap是采用数组+链表+红黑树的方式来存储和组织数据的。在put数据的时候,根据键的hash值寻址到具体数组位置,如果不存在hash碰撞,那么这个位置就只存储这么一个键值对。参见:put方法分析如果两个key的hash值相同,那么对应数组位置上就需要用链表的方式将这两个数据组织起来,当同一个位置上链表中的元素达到8个的时候,就会再将这些元素构建成一个红黑...转载 2019-09-26 12:23:33 · 277 阅读 · 0 评论 -
JDK8:HashMap源码解析:get方法、containsKey方法、getNode方法
一、概述HashMap存储的键值对,用put(K,V)方法来存储,用get(K)方法来获取V,用containsKey(K)方法来检查K是否存在。可先参见:put方法解析来了解键值对的存储原理,再来看get方法就很容易了。二、方法解析/*** 获取key对应的值,如果找不到则返回null* 但是如果返回null并不意味着就没有找到,也可能key对应的值就是null,因为Hash...转载 2019-09-26 12:23:41 · 249 阅读 · 0 评论 -
JDK8:HashMap源码解析:replacementTreeNode方法、TreeNode类
一、概述HashMap中每一个键值对都是以一个HashMap.Node<K,V>对象实例进行存储的,当不同的键对应的多个键值对路由到元素数组的同一个位置时,这多个键值对对应的Node对象之间会以链表的方式组织起来。这是默认的组织方式。当我们恰好要根据key寻找一个在链表上的对象的时候,就涉及到遍历链表,逐个调用key对象的equals方法来比对我们要查找...转载 2019-09-20 11:33:44 · 201 阅读 · 0 评论 -
JDK8:HashMap源码解析:TreeNode类的find方法
一、概述当我们向HashMap里put一个键值对的时候,需要检测键是否已经存在,如果存在需要替换值,如果不存在需要添加。当要添加的键产生了hash碰撞,并且碰撞位置上已经是一个树结构时,那么就需要检查该键是否存在于该树上,此时调用find来查找该键对应的节点对象。如果找到了就替换该节点的值,如果未找到就会向树上添加一个新的节点。二、源码解析/*** 这个方法是TreeNode类...转载 2019-09-20 11:32:11 · 329 阅读 · 0 评论 -
JDK8:HashMap源码解析:comparableClassFor、compareComparables、tieBreakOrder方法
一、概述在之前的文章里已经分析过,在发生hash碰撞(多个key的hash值相同)的时候,hashMap首先会采用链表进行存储,当链表节点数量达到一定阈值(8)会将链表上的节点再组织成一棵红黑树。红黑树是一种二叉树,每个父节点可以由左右两个节点。当put一个新元素时,如果该元素键的hash值小于当前节点的hash值的时候,就会作为当前节点的左节点;hash值大于当前节点hash值得时候作为...转载 2019-09-20 11:31:17 · 129 阅读 · 0 评论 -
JDK8:HashMap源码解析:treeifyBin方法
一、概述treeifyBin方法,应该可以解释为:把容器里的元素变成树结构。当HashMap的内部元素数组中某个位置上存在多个hash值相同的键值对,这些Node已经形成了一个链表,当该链表的长度大于等于9(为什么是9?TREEIFY_THRESHOLD默认值为8呀?详见put方法解析:https://blog.youkuaiyun.com/weixin_42340670/article/details/...转载 2019-09-20 11:28:54 · 510 阅读 · 1 评论 -
JDK8:HashMap源码解析:newNode方法、Node类
一、概述在Map中存储的每一个键值对都是以一个Map.Entry<K,V>的实现对象存储的,Map.Entry是一个接口,不能实例化,所以Map的不同实现类,存储键值对的方式也会有所不同,只要这个键值对的类实现了Map.Entry接口即可。在HashMap中键值对的存储方式有两种:其中一种是我们比较熟知的链表存储结构,也就是以HashMap.Node<K,V>类...转载 2019-09-20 11:26:35 · 473 阅读 · 0 评论 -
JDK8:HashMap源码解析:resize方法
一、概述HashMap的resize方法的作用:在向HashMap里put元素的时候,HashMap基于扩容规则发现需要扩容的时候会调用该方法来进行扩容。二、方法解析final Node<K,V>[] resize() { Node<K,V>[] oldTab = table; //当前所有元素所在的数组,称为老的元素数组 ...转载 2019-09-20 11:24:59 · 138 阅读 · 0 评论 -
JDK8:HashMap源码解析:TreeNode类的moveRootToFront方法
一、概述TreeNode在增加或删除节点后,都需要对整个树重新进行平衡,平衡之后的根节点也许就会发生变化,此时为了保证:如果HashMap元素数组根据下标取得的元素是一个TreeNode类型,那么这个TreeNode节点一定要是这颗树的根节点,同时也要是整个链表的首节点。二、方法解析/** * 把红黑树的根节点设为 其所在的数组槽 的第一个元素 * 首先明确:TreeNod...转载 2019-09-20 11:22:21 · 168 阅读 · 0 评论 -
JDK8:HashMap源码解析:hash方法
一、概述我们知道在HashMap中,一个键值对存储在HashMap内部数据的哪个位置上和K的hashCode值有关,这也是因为HashMap的hash算法要基于hashCode值来进行。这里要注意区分三个概念:hashCode值、hash值、hash方法、数组下标hashCode值:是KV对中的K对象的hashCode方法的返回值(若没有重写则默认用Object类的hashCode方法...转载 2019-09-20 11:20:09 · 154 阅读 · 0 评论 -
JDK8:HashMap源码解析:put方法
一、概述Map的put方法接受两个参数,key和value,该方法用于存储键值对。HashMap的put方法只有一行代码:return putVal(hash(key), key, value, false, true); //参见:hash方法解析可知put方法是一个方便用户使用的快捷方式,具体逻辑都是在putVal方法中实现的,我们就针对putVal方法的实现来做解析。...转载 2019-09-20 11:14:37 · 262 阅读 · 0 评论 -
HashMap最小树形化阈值MIN_TREEIFY_CAPACITY
HashMap的几个关键参数很重要,大家非常熟悉capacity loadFactory threshold tablesize以及下列jdk1.8后特有的红黑树相关参数。其中,最小树形化参数MIN_TREEIFY_THRESHOLD的作用到底是什么呢?/*** 与红黑树相关的参数*/// 1. 桶的树化阈值:即 链表转成红黑树的阈值,在存储数据时,当链表长度 > 该...转载 2019-09-26 12:23:05 · 7073 阅读 · 0 评论