TreeMap就这么简单【源码剖析】

echarts矩形树图treemap初体验 效果图如下 1、封装treeMap(treemap.vue) <template> <div :class="className" :style="{ height: height, width: width }" /> </template> <script> // 按需引入 引入 ECharts 主模块 // var echarts = require('echarts/lib/echarts' // 引入提示框和标题组件 require('. 阅读详情

前言

声明,本文用得是jdk1.8

前面章节回顾:

本篇主要讲解TreeMap~

看这篇文章之前最好是有点数据结构的基础:

当然了,如果讲得有错的地方还请大家多多包涵并不吝在评论去指正~

一、TreeMap剖析

按照惯例,我简单翻译了一下顶部的注释(我英文水平渣,如果有错的地方请多多包涵~欢迎在评论区下指正)

接着我们来看看类继承图:

在注释中提到的要点,我来总结一下:

  • TreeMap实现了NavigableMap接口,而NavigableMap接口继承着SortedMap接口,致使我们的TreeMap是有序的!
  • TreeMap底层是红黑树,它方法的时间复杂度都不会太高:log(n)~
  • 非同步
  • 使用Comparator或者Comparable来比较key是否相等与排序的问题~

对我而言,Comparator和Comparable我都忘得差不多了~~~下面就开始看TreeMap的源码来看看它是怎么实现的,并且回顾一下Comparator和Comparable的用法吧!

1.1TreeMap的域

1.2TreeMap构造方法

TreeMap的构造方法有4个:

可以发现,TreeMap的构造方法大多数与comparator有关:

也就是顶部注释说的:TreeMap有序是通过Comparator来进行比较的,如果comparator为null,那么就使用自然顺序~

打个比方:

  • 如果value是整数,自然顺序指的就是我们平常排序的顺序(1,2,3,4,5..)~

    TreeMap<Integer, Integer> treeMap = new TreeMap<>();

    treeMap.put(1, 5);
    treeMap.put(2, 4);
    treeMap.put(3, 3);
    treeMap.put(4, 2);
    treeMap.put(5, 1);

    for (Entry<Integer, Integer> entry : treeMap.entrySet()) {

        String s = entry.getKey() +"关注公众号:Java3y---->" + entry.getValue();

        System.out.println(s);
    }

1.3put方法

我们来看看TreeMap的核心put方法,阅读它就可以获取不少关于TreeMap特性的东西了~

下面是compare(Object k1, Object k2)方法


    /**
     * Compares two keys using the correct comparison method for this TreeMap.
     */
    @SuppressWarnings("unchecked")
    final int compare(Object k1, Object k2) {
        return comparator==null ? ((Comparable<? super K>)k1).compareTo((K)k2)
            : comparator.compare((K)k1, (K)k2);
    }

如果我们设置key为null,会抛出异常的,就不执行下面的代码了。

1.4get方法

接下来我们来看看get方法的实现:

点进去getEntry()看看实现:

如果Comparator不为null,接下来我们进去看看getEntryUsingComparator(Object key),是怎么实现的

1.5remove方法

删除节点的时候调用的是deleteEntry(Entry<K,V> p)方法,这个方法主要是删除节点并且平衡红黑树

平衡红黑树的代码是比较复杂的,我就不说了,你们去看吧(反正我看不懂)….

1.6遍历方法

在看源码的时候可能不知道哪个是核心的遍历方法,因为Iterator有非常非常多~

此时,我们只需要debug一下看看,跟下去就好!

于是乎,我们可以找到:TreeMap遍历是使用EntryIterator这个内部类的

首先来看看EntryIterator的类结构图吧:

可以发现,EntryIterator大多的实现都是在父类中:

那接下来我们去看看PrivateEntryIterator比较重要的方法:

我们进去successor(e)方法看看实现:

successor 其实就是一个结点的 下一个结点,所谓 下一个,是按次序排序后的下一个结点。从代码中可以看出,如果右子树不为空,就返回右子树中最小结点。如果右子树为空,就要向上回溯了。在这种情况下,t 是以其为根的树的最后一个结点。如果它是其父结点的左孩子,那么父结点就是它的下一个结点,否则,t 就是以其父结点为根的树的最后一个结点,需要再次向上回溯。一直到 ch 是 p 的左孩子为止。

来源:https://blog.youkuaiyun.com/on_1y/article/details/27231855

二、总结

TreeMap底层是红黑树,能够实现该Map集合有序~

如果在构造方法中传递了Comparator对象,那么就会以Comparator对象的方法进行比较。否则,则使用Comparable的compareTo(T o)方法来比较。

  • 值得说明的是:如果使用的是compareTo(T o)方法来比较,key一定是不能为null,并且得实现了Comparable接口的。
  • 即使是传入了Comparator对象,不用compareTo(T o)方法来比较,key**也是**不能为null的

    public static void main(String[] args) {
        TreeMap<Student, String> map = new TreeMap<Student, String>((o1, o2) -> {
            //主要条件
            int num = o1.getAge() - o2.getAge();

            //次要条件
            int num2 = num == 0 ? o1.getName().compareTo(o2.getName()) : num;

            return num2;
        });

        //创建学生对象
        Student s1 = new Student("潘安", 30);
        Student s2 = new Student("柳下惠", 35);

        //添加元素进集合
        map.put(s1, "宋朝");
        map.put(s2, "元朝");
        map.put(null, "汉朝");

        //获取key集合
        Set<Student> set = map.keySet();

        //遍历key集合
        for (Student student : set) {
            String value = map.get(student);
            System.out.println(student + "---------" + value);
        }
    }

我们从源码中的很多地方中发现:Comparator和Comparable出现的频率是很高的,因为TreeMap实现有序要么就是外界传递进来Comparator对象,要么就使用默认key的Comparable接口(实现自然排序)

最后我就来总结一下TreeMap要点吧:

  1. 由于底层是红黑树,那么时间复杂度可以保证为log(n)
  2. key不能为null,为null为抛出NullPointException的
  3. 想要自定义比较,在构造方法中传入Comparator对象,否则使用key的自然排序来进行比较
  4. TreeMap非同步的,想要同步可以使用Collections来进行封装

参考资料:


明天要是无意外的话,可能会写ConcurrentHashMap集合,敬请期待哦~~~~

文章的目录导航:https://zhongfucheng.bitcron.com/post/shou-ji/wen-zhang-dao-hang

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y。为了大家方便,刚新建了一下qq群:742919422,大家也可以去交流交流。谢谢支持了!希望能多介绍给其他有需要的朋友

【Java集合源码剖析】TreeMap源码剖析 前言 本文不打算延续前几篇的风格(对所有的源码加入注释),因为要理解透TreeMap的所有源码,对博主来说,确实需要耗费大量的时间和经历,目前看来不大可能有这么多时间的投入,故这里意在通过于阅读源码对TreeMap有个宏观上的把握,并就其中一些方法的实现做比较深入的分析。 红黑树简介 TreeMap是基于红黑树实现的,这里只对红黑树做个简单的介绍,红黑树是一种特殊的二叉排序树,关于二叉排序树,参见:http://blog.youkuaiyun.com/ns_code/article/details/ 阅读详情

相关推荐

vuejs-treemap:Vuejs + D3可缩放树状图

Vuejs + D3可缩放树状图 在Vuejs中将更新为d3v4的实现。 演示版 是的。 。 依存关系 (> = 4.x,首选6.x)和npm 3+版本。 (6.x) 构建设置 # install dependencies npm install # serve with hot reload at localhost:8080 npm run dev # build for production with minification npm run build # build for production and view the bundle analyzer report npm run build --report # run unit tests npm run unit # run e2e tests npm run e2e # run all tests npm test

TreeMap讲解

参看文章

weixin_42072632的博客 318

vue_echarts_treemap.zip

vue 2.x echarts treemap带示例数据及效果图,及在对话框里显示的处理方法

树型结构-vue

表格树型结构的处理--树型处理工具函数 /*** * 数组树形结构 转数型结构 * */ export function ArrTree(data) { var nwearr = data; let result = []; if (!Array.isArray(data)) { return result; } data.forEach(item => { delete item.children; }); let map = {}; dat

weixin_46252229的博客 363

vued3treeVUE实现自定义节点的树结构

vued3treeVUE实现自定义节点的树结构

treemap-chart:树形图交互式图表Web组件,用于可视化分层数据

树状图 交互式树图图表,用于可视化分层数据中的比例,其中树的节点表示为嵌套的完全堆积的矩形图块。 支持通过鼠标滚轮事件或单击节点(将视口聚焦在关联的子树上)的缩放交互。 该图表还通过将每个节点的尺寸动画化到其新位置来响应数据更改。 为了提高性能,将面积( width * height )小于给定阈值( minBlockArea )的节点从DOM中排除,从而允许在保持平滑交互的同时表示大型数据集。 有关随机生成的大型数据结构,请参见。 另请参见 ,和图表。 快速开始 import Treemap from 'treemap-chart'; 要么 const Treemap = requi

vue扁平数据转树形结构递归组件渲染

这里使用的是用map映射id和自身然后遍历通过parentid找父级的方法 源扁平数据: { "code": 200, "message": "操作成功", "data": [ { "functionId": 10000, "parentFunctionId": 0, "functionName": "安全检测" }, { "funct

Suk__的博客 706

天池长期赛:二手车价格预测(422方案分享)

本次比赛是一次很好的锻炼数据挖掘能力的入门赛,从EDA-数据清洗-特征工程-模型调参-模型融合,能够完整的学习到大数据的分析和挖掘,值得历练。

weixin_46685991的博客 1万+

【Vue中使用Echarts】echarts初体验

ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖矢量图形库 ZRender,提供直观,交互丰富,可高度个性化定制的数据可视化图表。本文介绍的是vue种如何集成echarts。通过本篇文章初学者可以快速入门在vue中使用echarts。

一个非常Cool的人 1546

HFSS仿真中如何提取最大E/H场强与频率关系曲线

本文详细讲解了在HFSS仿真中提取最大E/H场强与频率关系曲线的完整流程。通过使用场计算器(Field Calculator)和创建场报告,工程师可以准确获得器件在整个频带内的电场或磁场强度峰值,并进一步推导出关键的功率容量曲线,为高功率射频器件(如滤波器、耦合器)的设计提供至关重要的安全评估依据。

ss78901的博客 1099

基于ROS的机械臂手眼标定-Aruco使用与相机标定

基于ROS的机械臂手眼标定-Aruco使用与相机标定 折腾了一段时间的机械臂的手眼标定,相关资料挺多的,但使用起来都比较复杂,新手一般比较难搞懂。于是想做一个比较简单易懂易用的手眼标定程序。 程序都是Copy的开源代码,所以也开源出来: 开源地址:https://gitee.com/ohhuo/handeye-calib 作为手眼标定中的重要一环,相机中标定板位姿关系获取直接影响标定精度,我们使用aruco这个开源程序来实现坐标的获取。 #mermaid-svg-WkFpFkV4QqzXMvJ4 .labe

生活不止眼前的苟且 1万+

treemap怎么保证有序_TreeMap就这么简单【源码剖析】

前言声明,本文用得是jdk1.8前面章节回顾:Collection总览List集合就这么简单【源码剖析】Map集合、散列表、红黑树介绍HashMap就是这么简单【源码剖析】LinkedHashMap就这么简单【源码剖析】本篇主要讲解TreeMap~看这篇文章之前最好是有点数据结构的基础:Java实现单向链表栈和队列就是这么简单二叉树就这么简单当然了,如果讲得有错的地方还请大家多多包涵并不...

weixin_39541767的博客 2192

【两方演化博弈代码复现】:双方演化博弈的原理、概率博弈仿真、相位图、单个参数灵敏度演化

演化博弈论是研究个体在特定环境中如何通过策略选择与其他个体进行互动的学科。这一理论在生物学、经济学和社会科学等多个领域都有广泛应用。本文将深入探讨双方演化博弈的原理及其过程,并解读一段 MATLAB 代码,展示如何模拟这一过程。

当回首往事的时候,不会因虚度年华而悔恨,也不会因碌碌无为而羞愧。 6198

python treemap_TreeMap就这么简单【源码剖析】

前言声明,本文用得是jdk1.8前面章节回顾:本篇主要讲解TreeMap~看这篇文章之前最好是有点数据结构的基础:当然了,如果讲得有错的地方还请大家多多包涵并不吝在评论去指正~一、TreeMap剖析按照惯例,我简单翻译了一下顶部的注释(我英文水平渣,如果有错的地方请多多包涵~欢迎在评论区下指正)接着我们来看看类继承图:在注释中提到的要点,我来总结一下:TreeMap实现了NavigableMap接...

weixin_39893042的博客 940

Canoe CAPL TCP通信避坑指南:从OnTcpConnect回调不触发到Socket句柄管理

本文详细解析了Canoe CAPL中TCP通信的常见问题与解决方案,包括OnTcpConnect回调不触发的三大原因、Socket句柄管理的内存泄漏风险、数据发送截断规则等。通过实战案例和代码示例,帮助开发者规避TCP通信中的典型陷阱,提升车载网络测试的稳定性和可靠性。

weixin_26976635的博客 358

智能检查点优化:动态频率与差异化存储的断点续训实践(模型训练丨容错机制丨人工智能)

本文深入探讨了大规模模型训练中智能检查点优化的核心实践。针对传统固定频率保存导致的存储浪费与恢复缓慢问题,提出了基于损失变化率的动态频率算法与分层差异化存储策略。通过PyTorch代码示例,详细展示了如何实现动态调度与增量保存,有效降低存储成本,并确保训练中断后能快速、可靠地恢复,显著提升训练任务的容错能力与经济效益。

weixin_29072299的博客 333

java版地图源码_TreeMap就这么简单【源码剖析】

前言声明,本文用得是jdk1.8前面章节回顾:本篇主要讲解TreeMap~看这篇文章之前最好是有点数据结构的基础:当然了,如果讲得有错的地方还请大家多多包涵并不吝在评论去指正~一、TreeMap剖析按照惯例,我简单翻译了一下顶部的注释(我英文水平渣,如果有错的地方请多多包涵~欢迎在评论区下指正)接着我们来看看类继承图:在注释中提到的要点,我来总结一下:TreeMap实现了NavigableMap接...

weixin_36394468的博客 184

蓝牙Mesh协议一基本概念

前言 蓝牙SIG联盟在2017年发布了蓝牙Mesh1.0的协议规格,基于低功耗广播包来实现的多对多的通信技术,Mesh协议建立在BLE的物理层和链路层上,所以也可以和BLE的蓝牙进行通信 本章主要介绍蓝牙Mesh的基本概念和协议中的层级结构,也是参考网上的资料,如有异议,欢迎留言指正 基本概念 广播和洪泛 蓝牙Mesh技术是基于BLE的广播报文来实现的,是一种洪泛的消息传输机制,Mesh网络的节点间通过3个广播信道进行通信。当蓝牙Mesh网络中的节点收到消息后会转发这条消息,大大增加了网络的覆盖范围;但

9740

TreeMap、LinkedHashMap(含LRU)就这么简单【源码剖析】

前言 声明,本文用的是jdk1.8 前面章节回顾: 湿兄红着眼熬夜肝了篇集合ArrayList(附源码分析) 湿兄这一篇LinkedList也是红着眼(附源码分析) Java中的Map集合、散列表、红黑树介绍 Java集合是Java提供的工具包,包含了常用的数据结构:集合、链表、队列、栈、数组、映射等。Java集合工具包位置是java.util.*,Java集合主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Ar

637

本地部署大模型 vs 网页版大模型区别

fill:#333;color:#333;color:#333;fill:none;本地服务器/工作站硬件资源私有化部署GPU集群高速存储模型文件训练框架推理引擎。

Ds-Rag的博 1712

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【Java集合】TreeSet、TreeMap源码解读

本文将通过Debug流程分析,剖析TreeSet以及 TreeMap的底层实现。TreeSet的底层基于TreeMap实现,而TreeMap使用红黑树 Red-Balck Tree作为数据结构。因此本文在对源码分析之前会先介绍一下红黑树的基本知识注意:本篇博文对HashSet源码的解读基于主流的JDK 8.0的版本①TreeSet是单列集合Set接口的一个实现类,位于②TreeSet中的元素不能为null,否则会报③与HashSet类不同,

m0_55908255的博客 1231

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: LinkedHashMap就这么简单【源码剖析】
下一篇: 视频资源大整理
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值