首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【JavaSE专栏54】Java集合类TreeMap解析,基于红黑树的键值对存储结构

一、什么是TreeMap TreeMap 是 Java 中的一个有序映射类,实现了 SortedMap 接口,它是基于红黑树数据结构实现的,用于存储键值对,并根据键的自然顺序或指定的比较器进行排序,与...排序需求:当需要按照键的顺序访问和处理数据时,可以使用 TreeMap 来存储键值对,并利用排序特性方便地进行相关操作。...范围查询:当需要根据键的范围来查询和操作数据时,可以利用 TreeMap 提供的范围查询方法来快速定位所需的子映射。...排序需求:当需要按照键的顺序访问和处理数据时,可以使用 TreeMap 来存储键值对,并利用排序特性方便地进行相关操作。例如,根据学生的分数进行排名、按照日期对事件进行排序等。...例如,根据日期范围查询某段时间内的事件。 时间轴数据存储:TreeMap 结构适合存储时间轴数据,因为时间是有序的。可以将时间作为键,事件或数据作为值,便于按照时间顺序进行检索和分析。

67440

面试必会:HashMap 实现原理解读

8个时,默认值为Node的单向链表形式存储,当单个Hash值存储的元素大于8个时,其会使用TreeNode的数据结构存储。...因为在单个Hash值对应的元素小于等于8个时,其查询时间最差为O(8),但是当单个Hash值对应的元素大于8个时,再通过Node的单向链表的方式进行查询,速度上就会变得更慢了;这个时候HashMap就会将...(Red Black Tree)的数据结构,红黑树是一种自平衡二叉查找树,在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能,即使在最坏情况运行时间也是非常良好的,并且在实践中是非常高效的...// 在Java中整型为4个字节32位,无符号向右移16位,表示将高16位移到低16位上,然后再执行异或运行,也 // 就是将hash code的高16位与低16位进行异或运行。...// 小于等于65535的数,其高16位全部都为0,因而将小于等于65535的值向右无符号移16位,则该数就变成了 // 32位都是0,由于任何数与0进行异或都等于本身,因而hash code小于等于

58210
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    解决ANR、JVM、Serializable与Parcelable、红黑树、一道算法题

    通常需要从那个以下几个方案下手: a)使用子线程处理耗时IO操作 b)降低子线程优先级,使用Thread或者HandlerThread时,调用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND...Java内存分配 基础数据类型直接在栈空间分配; 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收; 引用数据类型,需要用new来创建,既在栈空间分配一个地址空间,又在堆空间分配对象的类变量...} } } 群友总结 双指针法:从两端取呀,小了移动左边指针,大了移动右边指针,复杂度O(n) 可以用两个指针,一个指针指向第一个元素,一个移至最后一个元素,然后判断指针指向的两个元素和,是否小于等于...30,不等于的话前移后面的指针。...等于30的话输出。找到30的以后再同时移动两个指针,不等于30的时候后移前面的指针,直到找到位置,找到后继续前移后面的指针,以此类推,直到前面的指针地址不小于后面指针的地址。

    46820

    经典数据结构 +B树的应用

    3、当咱们插入E,K,Q时,不需要任何分裂操作 ? 4、插入M需要一次分裂,注意M恰好是中间关键字元素,以致向上移到父节点中 ? 5、插入F,W,L,T不需要任何分裂操作 ?...6、插入Z时,最右的叶子结点空间满了,需要进行分裂操作,中间元素T上移到父节点中,注意通过上移中间元素,树最终还是保持平衡,分裂结果的结点存在2个关键字元素。 ?...(5/2)-1=2),则可以向父结点借一个元素,然后将最丰满的相邻兄弟结点中上移最后或最前一个元素到父节点中(有没有看到红黑树中左旋操作的影子?)...顺序链中所有的关键字不能连接在一起。...当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,然后异常返回,程序继续运行。

    63230

    Java数据结构-------Map

    在Java8中,当链表的长度大于8时,有可能转化为红黑树。...之后引入了红黑树的概念,表示若桶中链表元素超过8时,会自动转化成红黑树;若桶中元素小于等于6时,树结构还原成链表形式。     ...1、为什么选择当链表长度为8时转换为红黑树?为啥不是6、10?       ...2)查询和更新成本         采用红黑树和链表进行查询时的平均查找长度对比如下:           当长度为8时,log(n)=3 8/2=4           当长度为7时,log(...2、当执行remove,红黑树中的元素小于8时会不会转换回链表?为什么?       选择6时转换会链表的考虑:       中间有个差值7可以防止链表和树之间频繁的转换。

    1.4K20

    深入探讨源码-HashMap

    static final float DEFAULT_LOAD_FACTOR = 0.75f; // 树形化阈值,当链表节点个大于等于TREEIFY_THRESHOLD - 1时, // 会将该链表换成红黑树...static final int TREEIFY_THRESHOLD = 8; // 解除树形化阈值,当链表节点小于等于这个值时,会将红黑树转换成普通的链表。...static final int UNTREEIFY_THRESHOLD = 6; // 最小树形化的容量,即:当内部数组长度小于64时,不会将链表转化成红黑树,而是优先扩充数组。...integer类型的hashCode都是他自身的值,即h=key; h >>> 16为无符号右移16位,低位挤走,高位补0;^ 为按位异或,即转成二进制后,相异为1,相同为0,由此可发现,当传入的值小于...方法中(n - 1)& hash计算得到桶的索引位置 //注意,这里h是int值,也就是32位,然后无符号又移16位,那么就是折半,折半之后和原来的数据做异或操作,正好整合了高位和低位的数据 //混合原始哈希码的高位和低位

    35220

    HashMap源码阅读笔记

    final int TREEIFY_THRESHOLD = 8; /** * 取消阈值:当一个桶中的元素个数小于等于6时把树转化为链表 **/ static final int UNTREEIFY_THRESHOLD...当容量超过3/4时扩容。 树化 树化,当容量达到64且链表的长度达到8时进行树化,当链表的长度小于6时反树化。...然后按照链表顺序取出节点进行红黑树插入,以及插入后平衡操作(左旋右旋/变色) ? ? 4.5、反树化 当链表的长度小于6时反树化,即红黑树退化成链表。...)的存储结构 HashMap的默认初始容量为16(1<<4),默认装载因子为0.75f,容量总是2的n次方 HashMap扩容时每次容量变为原来的两倍 当桶的数量小于64时不会进行树化,只会扩容 当桶的数量大于...64且单个桶中元素的数量大于8时,进行树化 当单个桶中元素数量小于6时,进行反树化 HashMap是非线程安全的 HashMap查找添加元素的时间复杂度都为O(1) ---- 本文为学习笔记,参考资料如下

    48510

    拔刺 | 如何评价汽车AI系统?是好“助理”吗?

    车载AI系统功能贴心,当你饿了,系统能够根据你的常去的餐馆类别自动推荐附近的类似餐馆;当接近拥堵或经常拥堵的路段系统会提醒你换线;当车辆燃油即将用完时它会主动提醒你加油并优选最近的加油站,然后把路线显示出来...在运动的波源前面,波被压缩,波长变得较短,频率变得较高(蓝移);在运动的波源后面时,会产生相反的效应(红移)。...举个实际点的例子,一列火车朝着观察者开来,这时如果鸣笛,观察者听到的频率会大于鸣笛时发出的频率,相反如果火车远离观察者开去的时候鸣笛,观察者听到的频率会小于鸣笛时发出的频率。...多普勒同样适用于电磁波,所以当雷达发出电磁波时当它碰到探测的物体时,会反射回来,这时候就会产生多普勒效应。在这时接收到的波会发生红移或者蓝移,雷达会通过蓝移和红移的程度计算出物体的速度以及位置信息。...红外成像的原理与人眼类似,如红外探测仪,它就像一双眼睛,这双眼睛里的特制ccd或cmos感光元件可感知红外线的照射。

    64120

    (43) 剖析TreeMap 计算机程序的思维逻辑

    subMap:为大于等于fromKey且小于toKey的所有键。...floorEntry:邻近键是小于等于key的键中最大的 lowerEntry:邻近键是严格小于key的键中最大的 ceilingEntry:邻近键是大于等于key的键中最小的 higherEntry:...当添加第一个节点时,root为null,执行的就是这段代码,主要就是新建一个节点,设置root指向它,size设置为1,modCount++的含义与之前几节介绍的类似,用于迭代过程中检测结构性变化。...t一开始指向根节点,从根节点开始比较键,如果小于根节点,就将t设为左孩子,与左孩子比较,大于就与右孩子比较,就这样一直比,直到t为null或比较结果为0。...如果t为null,则当退出循环时,parent就指向待插入节点的父节点。

    91980

    HashMap在JDK1.8前后区别精简说

    在JDK1.8以前版本中,HashMap的实现是数组+链表,它的缺点是即使哈希函数选择的再好,也很难达到元素百分百均匀分布,而且当HashMap中有大量元素都存到同一个桶中时,这个桶会有一个很长的链表,...在JDK1.8及以后的版本中引入了红黑树结构,HashMap的实现就变成了数组+链表或数组+红黑树。...添加元素时,若桶中链表个数超过8,链表会转换成红黑树;删除元素、扩容时,若桶中结构为红黑树并且树中元素个数较少时会进行修剪或直接还原成链表结构,以提高后续操作性能;遍历、查找时,由于使用红黑树结构,红黑树遍历的时间复杂度为...HashMap在JDK1.8及以后的版本中引入了红黑树结构,若桶中链表元素个数大于等于8时,链表转换成树结构;若桶中链表元素个数小于等于6时,树结构还原成链表。...链表长度如果是小于等于6,6/2=3,虽然速度也很快的,但是转化为树结构和生成树的时间并不会太短。 选择6和8,中间有个差值7可以有效防止链表和树频繁转换。

    80670

    心里没点 B 树。。。

    B 树和红黑树的动画小吴还在制作当中,比想象中的复杂好多好多好多,今天先来一个图解版的 B 树。。。...图1.0 图1.1 通过查找过程可以看出,磁盘IO次数与树的高度相关,在最坏情况下,磁盘IO次数等于树的高度。...我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数。当m取2时,就是我们常见的二叉搜索树,m为3时是2-3树。...(2)判断当前结点key的个数是否小于等于m-1,若满足,则结束直接插入数据,否则,进行第(3)步。   ...当前节点的兄弟节点有3个key,父节点中key28下移,兄弟节点中key26上移,调整结束。调整完毕后继续删除32。

    63420

    你真的知道你有多少家门店吗?让专家帮你用 PowerBI 算

    在正常经营了几年后,门店的装修及道具需要升级改造,或是由于经营业绩原因,需要扩大或缩小营业面积,门店进入重装阶段,这样会有重装开始日期及重装结束日期。...门店不产生销售的日期,就作为撤店日期。门店在系统中的状态,就根据这几个阶段,分为装修中、营业中、重装中、撤店。计算门店数时,就要根据以上这些字段确定。...当门店的开业时间小于等于当前期间的最大值,并且处于经营状态(撤店日期为空)或者已撤店但撤店日期大于当前期间的最大值(即当前期间还未撤),那么该店在当前期间为有效经营门店。...,再通过 PREVIOUSDAY 前移一日找到上年末日期,从而求得上年末门店数,即为本年初始门店数。...] 处于本期期间内,则记为本期新增或本期撤店。

    1.4K20

    Github Hacking | Google Hacking- 信息搜集篇 - 渗透红队笔记

    大家好,这里是 渗透攻击红队 的第 九 篇文章,本公众号会记录一些我学习红队攻击的复现笔记(由浅到深),笔记复现来源于《渗透攻击红队百科全书》出自于 亮神 ,每周一更 ?...Github不仅能托管代码,还能对代码进行搜索,我们感受到了其便利的同时,也应该时刻注意,当你上传并公开你的代码时,一时大意,让某些敏感的配置信息文件等暴露于众。...---- 我们可以通过搜索页面或高级搜索页面搜索Github。 我们还可以使用 > , >= , 等于、小于和小于等于。...注意事项: 只能搜索小于384KB的文件。 只能搜索少于500,000个文件的存储库。 登陆的用户可以搜索所有公共存储库。 除 filename 搜索外,搜索源代码时必须至少包含一个搜索词。...日期条件: cats pushed:<2012-0705 搜索在2012年7月05日前push代码,且cats作为关键 cats pushed:2016-04-30..2016-07-04 日期区间

    2.2K20

    HashMap设计思想学习

    8时,进行替换;当然,如果此时数组长度没有大于等于64,那么会先尝试通过扩容数组大小来减少链表长度。...扩容时,如果某个树的元素个数小于了6,那么红黑树会退化为链表,或者红黑树根节点的左右孩子或者左孙子中有一个为null,也会退化为链表。...AVL自平衡二叉树在二叉搜索树的基础上进行了优化,需要满足左右子树的高度差小于等于1,AVL树的最差查询和插入复杂度也为O(logn)。...hashcode–>二次哈希–>与运算 3.如果桶下标没人占用,创建Node占位返回 4.如果桶下标已经被占用了 4.1 已经是TreeNode走红黑树添加或者更新逻辑 4.2 是普通的Node,走连接的添加或更新逻辑...4.2.1 如果链表长度超过树化阈值8,并且当前数组容量是小于64,那么会首先通过扩容,减少链表长度 4.2.2 如果链表长度超过树化阈值8,并且当前数组容器是大于等于64,那么会将链表转换为红黑树

    94050

    红黑树的实现:原理与底层解析

    旋转操作和变色:在插入或删除节点时,红黑树通过旋转和变色操作,动态维护这几个规则。 由于红黑树的这些规则,红黑树的最短路径和最长路径之间的长度差异不会超过2倍。...抽象图 情况2:p为红,u为空或不存在,单旋+变色 在红黑树的插入过程中,情况2 涉及的是当新插入的节点 c 和它的父节点 p 都是红色,而 p 的兄弟节点 u(叔叔节点)不存在或是黑色的情况。..._root->_col = BLACK; return true; } 步骤1:判断父节点 p 是否为红色 当 p 为红色时,由于 c 也是红色,因此违反了红黑树的规则3,需要进行调整。...抽象图 情况3:双旋+变色 在红黑树的插入过程中,当新插入的节点 c 和其父节点 p 都是红色,而 p 的兄弟节点 u(叔叔节点)不存在或是黑色时,若 c 和 p 处于特定位置关系,无法通过单次旋转解决平衡问题..._root->_col = BLACK; return true; } 步骤1:判断父节点 p 是否为红色 当 p 为红色时,且 u 为黑色或不存在,表示我们无法通过简单的变色来解决问题。

    13410

    每天5道Java面试题(第9天)

    当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket(桶)里。...Java1.8对HashMap做了改进,在链表长度大于8的时候,将后面的数据存在红黑树中,以加快检索速度。后续如果由于删除或者其他原因调整了大小,当红黑树的节点小于或等于 4. ...所以在java1.8中,当链表过长时,会将该链表自动转为红黑树,红黑树是一个自平衡二叉树,能够优化查找的性能。 5. 在hashMap中链表什么情况下才会变成红黑树?...把链表转为红黑树、还是选择扩容,看这几个阀值: ①,当链表的长度 大于8,并且entry数组的长度大于64时,才会将链表转为红黑树。...②,当链表的长度小于 6,但是entry数组的长度小于64时,不转为红黑树,而是调用resize方法进行扩容;

    14540

    用matplotlib和pandas绘制股票MACD指标图,并验证化交易策略

    第一,当DIF和DEA两者的值均大于0(在x轴之上)并向上移动时,一般表示当前处于多头行情中,建议可以买入。反之,当两者的值均小于0且向下移动时,一般表示处于空头行情中,建议卖出或观望。...第二,当DIF和DEA的值均大于0但都在向下移动时,一般表示为上涨趋势即将结束,建议可以卖出股票或观望。同理,当两者的值均小于0,但在向上移动时,一般表示股票将上涨,建议可以持续关注或买进。...比如,当没有形成明显的上涨或下跌趋势时(即在盘整阶段),DIF和DEA这两个指标会频繁地出现金叉和死叉的情况,这时由于没有形成趋势,因此金叉和死叉的指导意义并不明显。...当满足这个条件时,再通过第22行的if语句判断当天的Bar柱数值是否小于前一天的,即判断Bar柱是否在向下运动。当满足这两个条件时,通过第23行的代码输出建议卖出股票的日期。...正确 从上述的验证结果可知,从MACD指标中能看出股价发展的趋势,当从强势开始转弱时,如果没有其他利好消息,可以考虑观望或适当卖出股票。

    4.2K10

    Java基础知识:HashMap(一)

    同时数组长度小于 64 时,搜索时间相对要快。 所以综上所述,为了提高性能和减少搜索时间,底层在阈值大于 8 且数组长度大于 64 时,链表才转换为红黑树。具体参考 treeifyBin 方法。...解答: 会发生哈希碰撞,若 key 值内容相同则替换旧的 value ,不然连接到链表的后面,直至链表长度超过阈值 8 且数组长度超过 64 时再采用红黑树存储。...当它们变得太小(由于删除或调整大小)时,就会被转换会普通的桶。在使用分布良好的用户 hashcode 时,很少使用树箱。理想情况下,在随机哈希码下,箱子中节点的频率服从泊松分布。...\frac{n}{2}2n​ ,当长度为 8 时,平均查找长度为 82=4\frac{8}{2}=428​=4 ,这才有转换成树的必要,链表长度如果是小于等于 6,62=3\frac{6}{2}=326​...4.3 红黑树转回链表 //当桶(bucket bin)上的节点数小于这个值时树转为链表 static final int UNTREEIFY_THRESHOLD = 6; 当 Map 里面的数量超过这个值时

    86511

    面试官系统精讲Java源码及大厂真题 - 08 HashMap 源码解析

    其中当链表的长度大于等于 8 时,链表会转化成红黑树,当红黑树的大小小于等于 6 时,红黑树会转化成链表,整体的数据结构如下: 图中左边竖着的是 HashMap 的数组结构,数组的元素可能是单个 Node...8时,链表转化成红黑树  static final int TREEIFY_THRESHOLD = 8;  //桶上的红黑树大小小于等于6时,红黑树转化成链表  static final int...UNTREEIFY_THRESHOLD = 6;  //当数组容量大于 64 时,链表才会转化成红黑树  static final int MIN_TREEIFY_CAPACITY = 64;...当链表长度大于等于 8 时,此时的链表就会转化成红黑树,转化的方法是:treeifyBin,此方法有一个判断,当链表长度大于等于 8,并且整个数组大小大于 64 时,才会转成红黑树,当数组大小小于 64...面试的时候,一般只会问到新增节点到红黑树上大概是什么样的一个过程,着色和旋转的细节不会问,因为很难说清楚,但我们要清楚着色指的是给红黑树的节点着上红色或黑色,旋转是为了让红黑树更加平衡,提高查询的效率,

    29953
    领券