/*获取红黑树的指定节点*/ final TreeNode<K,V> getTreeNode(int h, Object k) { return ((parent != null) ? root() : this).find(h, k, null);// 从根节点开始查询 } /*获取红黑树指定节点*/ final TreeNode<K,V> find(int h, Object k, Class<?> kc) { TreeNode<K,V> p = thi…
概述 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型.随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等.本文主要分析一下HashMap中红黑树树化的过程. 红黑树(red black tree) 一个节点标记为红色或者黑色. 根是黑色的. 如果一个节点是红色的,那么它的子节点必须是黑色的(这就是为什么叫红黑树). 一个节点到到一个null引用的每一条路径必须包含相…
本文学习知识点 1.二叉查找树,以及二叉树查找带来的问题. 2.平衡二叉树及好处. 3.红黑树的定义及构造. 4.ConcurrentHashMap中红黑树的构造. 在正式分析红黑树之前,有必要了解红黑树的发展过程,请读者耐心阅读. 二叉查找树 红黑树的起源得从二叉查找树(二叉排序树)说起.先来看二叉查找树的定义: 1.要么为一颗空树,要么就是一颗具有如下特性的二叉树. 2.左子节点的值必须小于等于父节点的值. 3.右子节点的值必须大于等于父节点的值. 每个节点都符合这个特性,所以易于查找,如下…
红黑树介绍 1.节点是红色或黑色. 2.根节点是黑色. 3.每个叶子节点都是黑色的空节点(NIL节点). 4 每个红色节点的两个子节点都是黑色.(从每个叶子到根的所有路径上不能有两个连续的红色节点) 5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点 JDK1.8 HashMap$TreeNode.balanceInsertion 红黑树平衡插入…
红黑树介绍 1.节点是红色或黑色. 2.根节点是黑色. 3.每个叶子节点都是黑色的空节点(NIL节点). 4 每个红色节点的两个子节点都是黑色.(从每个叶子到根的所有路径上不能有两个连续的红色节点) 5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点 JDK1.8 HashMap$TreeNode.rotateLeft 红黑树左旋的图示如下…
2-3树:插入变成2个节点正常插,变成3个节点就要提升中间节点和分裂子节点,满足:要么没有子节点,要么2个子节点,要么3个子节点. 2-3-4树:插入变成2个不动,插入变成3个不动,插入变成4个提升原来中间节点和分裂子节点,满足:要么没有子节点,要么2个子节点,要么3个子节点,要么4个子节点. 2节点黑色,3节点左倾和右倾,4节点上黑下2红. 左倾2-3树:2节点黑色,3节点左下红右上黑. 红黑树插入和2-3-4树的对应关系: 先插入10再插入12,所以是右倾. 先提升12分裂10和14,所以1…
在JDK1.6,1.7中,HashMap的实现都是用基础的“拉链法”去实现,即数组+链表的形式.如下图:通过不同的hash值,来对数据进行分配存储. 关于HashMap的Entry长度,可以参考http://wiki.jikexueyuan.com/project/java-collection/hashmap.html 简要来说,要保证初始化时 HashMap 的容量总是 2 的 n 次方,即底层数组的长度总是为 2 的 n 次方. 那么 HashMap 什么时候进行扩容呢?当 HashMap…
HashMap在jdk1.8之后引入了红黑树的概念,表示若桶中链表元素超过8时,会自动转化成红黑树:若桶中元素小于等于6时,树结构还原成链表形式. 原因: 红黑树的平均查找长度是log(n),长度为8,查找长度为log(8)=3,链表的平均查找长度为n/2,当长度为8时,平均查找长度为8/2=4,这才有转换成树的必要:链表长度如果是小于等于6,6/2=3,虽然速度也很快的,但是转化为树结构和生成树的时间并不会太短. 还有选择6和8的原因是: 中间有个差值7可以防止链表和树之间频繁的转换.假设一下…
字符串或串(String)是由数字.字母.下划线组成的一串字符.一般记为 s=“a1a2···an”(n>=0).它是编程语言中表示文本的数据类型.在程序设计中,字符串(string)为符号或数值的一个连续序列,字符串在存储上类似字符数组,所以它每一位的单个元素都是可以提取的,如s=“abcdefghij”,则s[1]=“a”,s[10]="j" //线性序列,里面只存了一个元素,map存的是键值对 vector  [2,3,4,5]   操作,插入删除低  查找效率高 list…
在看HashMap的源码时候看到了TreeNode.因此需要对其进行一个了解.是一个红黑树.可以百度一下红黑树的数据结构.分析了下源码,还是比较枯燥的 红黑树的性质:本身是一个二叉查找树(所有左节点的值都比右节点的小).另: 节点是红色或者黑色 根节点是黑色 每个叶节点(Nil节点,空节点)是黑色的 每个红节点对应的两个子节点都是黑色的(不可能有两个相连的红节点). 从任意节点出发,到每个叶子节点都有相同的黑色节点. 这保证了红黑数是平衡的,从根到叶子的最长的可能路径不多于最短的可能路径的两倍长…