1.TreeMap是如何实现去重和排序的?

TreeMap实现了SortedMap接口,它是一个key有序的Map类。

TreeMap的默认排序规则:

TreeMap并不是根据插入的顺序来排序,而是根据key元素的 compareTo 方法来排序。

Map<Integer, Object> map = new TreeMap<>();
map.put(5, new Object());
map.put(10, new Object());
map.put(8, new Object());
map.put(12, new Object());
System.out.println(map);

输出结果:

{5=java.lang.Object@49097b5d, 8=java.lang.Object@6e2c634b, 10=java.lang.Object@37a71e93, 12=java.lang.Object@7e6cbb7a}

自定义排序:

我们还可以向TreeMap的构造方法中传入 Comparator 对象来覆盖元素的默认排序规则。即:当TreeMap 创建时如果有传入 Comparator ,优先按照 Comparator 的规则来排序,如果没有传入 Comparator ,就按照key的 compareTo 方法来排序。

测试代码:

Map<Integer, Object> map = new TreeMap<>(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}
});
map.put(5, new Object());
map.put(10, new Object());
map.put(8, new Object());
map.put(12, new Object());
System.out.println(map);

输出结果:

{12=java.lang.Object@49097b5d, 10=java.lang.Object@6e2c634b, 8=java.lang.Object@37a71e93, 5=java.lang.Object@7e6cbb7a}

判断重复的依据:

在HashMap中判断key是否重复的依据是根据hash值和equals比较,但是在TreeMap中,判断key是否重复的依据是根据 comparaTo 是否为0,如果为0,TreeMap 就认为key是重复的。

从源码上看TreeMap去重和排序的实现原理:

在添加时,key去重的原理:

从TreeMap的put方法源代码每次要向TreeMap中添加新的键值对时,会执行以下步骤:

  • 定义一个指针先指向二叉树的向根节点
  • 将传入的key与指针节点的key对比,如果传入的key大于指针节点的key,就将指针移动到当前节点的右子树,如果传入的key小于指针节点的key,就将指针移动到当前节点的左子树。
  • 循环执行上一步,直到传入的key值与指针节点的key值相等,就将value值替换掉,或者指针已经移动到底了,就将传入的key和value作为新的节点,添加到树的底部
  • 为了维护红黑树的平衡,将一些节点翻转,代码细节在 fixAfterInsertion 方法中,这里面的代码与插入去重无关,就不再展开来说了。

在遍历的时候时如何有序的:

由于TreeMap在存入节点的时候已经是按照排序二叉树的特性来插入了,所以在遍历二叉树的时候只要用中序遍历,就可以按照从小到大的顺序读取每一个节点了。

TreeMap排序是怎么样的?相关推荐

  1. java treemap 排序原理,Java TreeMap排序算法实例

    本文实例讲述了Java TreeMap排序算法.分享给大家供大家参考,具体如下: TreeMap 和 HashMap 用法大致相同,但实际需求中,我们需要把一些数据进行排序: 以前在项目中,从数据库查 ...

  2. Scala堆的方式进行Spark topK词频查询(根据value进行TreeMap排序)

    本文来自:http://blog.csdn.net/liangyihuai/article/details/54925737 本文使用了两种方法进行spark 的top k词频查询,第一种方法在很多博 ...

  3. TreeMap 排序

    一.TreeMap TreeMap 默认排序规则:按照key的字典顺序来排序(升序) 当然,也可以自定义排序规则:要实现Comparator接口. 用法简单,先看下下面的demo public cla ...

  4. TreeMap排序探寻

    TreeMap本身是默认带有升序排序的策略的,如果要修改其排序规则,有2种方式. 1.实体元素实现Comparable接口,重写compareTo方法. 2.实现Cpmparator 重写compar ...

  5. java8 treemap 排序_Java中TreeMap按照KEY排序实现讲解

    TreeMap 是一个有序的key-value集合,它是通过红黑树实现的,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法.继承于A ...

  6. Java之项目用到类Objects,TreeMap排序简单分享

    开心一笑 [记者去采访一山区百岁老农: "老人家,你是吃什么东西才能保持长寿的啊?" 百岁老农: "我们这只能种玉米,平时也是以玉米为主食." 记者: &quo ...

  7. java treemap get_java treeMap 排序后 get不到value

    代码如下importjava.util.*;publicclassmain{publicstaticvoidmain(String[]args){HashMapmap=newHashMap();Val ...

  8. TreeMap排序中遇到的问题

    import java.util.Comparator; import java.util.TreeMap;/*** @author hxh* @version 1.0* @date 2019/3/2 ...

  9. Java-Map从入门到性能分析3【LinkedHashMap(性能耗时对比、模拟LRU缓存)、TreeMap(排序、性能对比)】

    [视频网址]:慕课网--Map从入门到性能分析 简介:Map是开发中,使用频率最高的知识点之一,Map家族也有很多成员,例如HashMap,LinkedMap等, 怎样更好地使用Map家族的这些成员, ...

  10. android treemap put的时候是不是会排序,TreeMap按照value进行排序

    TreeMap底层是根据红黑树的数据结构构建的,默认是根据key的自然排序来组织(比如integer的大小,String的字典排序).所以,TreeMap只能根据key来排序,是不能根据value来排 ...

最新文章

  1. Python中的urllib.quote和Go中的url.QueryEscape关系探讨
  2. iOS-获取子视图父控制器
  3. hdu 4502(DP)
  4. 图解在emu8086中学习汇编语言数字比较程序
  5. fastjson异常问题
  6. Windows7安全体验
  7. 【资料整理】一些英语面试题整理
  8. js删除两个集合中共同元素_多个集合中的共同和独特元素
  9. linux学习一个服务(未完)
  10. java ssm框架登录代码,求一个SSM框架登录功能的源码,要求能运行成功
  11. python 不等于_python怎么一次输入两个数
  12. java获取C盘下的隐藏目录文件名称
  13. 关于javascript中apply()和call()方法
  14. linux下安装tuxedo
  15. 修改linux的防火墙
  16. python身份证号真假验证_【趣味案例】用python制作全国身份证号验证及查询系统...
  17. 如何手动启动消防广播_消防应急广播应如何规范设置
  18. Excel基础篇(四):查找重复身份证号码
  19. 【题解】【AcWing】1564. 哈希
  20. 提问:微信网页授权到第三方调用错误、调用微信公众号扫码登陆错误、微信SCOP权限错误或没有权限

热门文章

  1. 罗马数字转换 java_JAVA 罗马数字转换成公历年
  2. 电子计算机分类 可以分为哪些,计算机按照工作原理进行分类可以分为
  3. 两数相加(有序/无序) 时间复杂度小于 O(n2)做题心得
  4. Datawhale组队学习开源内容汇总
  5. 帝国PHP二次开发,帝国CMS二次开发基本问题汇总
  6. java通过exchange发送邮件(带附件)
  7. java设置一个内部类child_java的内部类及匿名内部类
  8. docker卸载mysql_Docker卸载镜像
  9. 如何快速转载网页博客
  10. cad画流程图的插件_CAD高手教您画工艺流程图设计一些列图