TreeMap 按照 Key 的排序结果来组织内部结构的Map类集合,它改变了Map类散乱无序的形象。虽然TreeMap没有ConcurrentHashMap 和 HashMap 普及,但是在Key有排序的要求的场景下,使用 TreeMap 可以事半功倍。在集合框架如中,他们都继承AbstractMap 抽象类,TreeMap 与 HashMap 、ConcurrentHashMap 的类图关系如下:


  • TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合。
  • TreeMap 实现了 SortedMap 接口,表示它的Key是有序的。支持获取头尾 Key-Value 元素,或者根据Key指定范围获取子集合等。插入的Key 必须实现Comparable 或者 提供额外的比较器 Comparator,所以Key不允许为null, 但是Value可以
  • TreeMap 实现 NavigableMap 接口继承了 SortedMap 接口,根据指定的搜索条件返回最匹配的Key-Value元素。不同于HashMap,TreeMap 并非一定要覆写hashCode 和 equals 方法来达到Key去重的目的。
  • TreeMap 实现了Cloneable接口,意味着它能被克隆。
  • TreeMap 实现了java.io.Serializable接口,意味着它支持序列化。
public class TreeMapTest {public static void main(String[] args) {//如果把此处的TreeMap 换成 HashMap ,则 size = 1TreeMap treeMap = new TreeMap();treeMap.put(new Key(),"value  one");treeMap.put(new Key(),"value  two");// TreeMap ,size = 2 , 因为Key 去重规是根据排序结果System.out.println(treeMap.size());}static class Key implements  Comparable<Key>{@Overridepublic int compareTo(Key o) {//返回负数的常数,表示此对象永远小于输入的other对象,此处决定TreeMap的size=2return -1;}@Overridepublic int hashCode() {return 1;}@Overridepublic boolean equals(Object obj) {return true;}}
}

上面的例子,如果把TreeMap 换成 HashMap ,size的结果则从2变成1。

注意 HashMap 是使用 hashCode 和 equals 实现去重的。

而TreeMap 则依靠Comparable 或 Comparator 来实现Key的 去重,

TreeMap 有两种排序:

  1. 自然排序: TreeMap 的所有Key必须实现 Comparable 接口,而且所有的key应该是同一个类的对象,否则将会抛出 ClassCastException 异常。
  2. 定制排序: 创建TreeMap 时,传入一个Comparator对象,该对象负责对TreeMap中的所有key进行排序。采用定制排序时不要求Map的key实现 Comparable接口。

如果没有覆盖正确的方法,那么TreeMap 的最大特性将无法发挥出来,甚至在运行时出现异常。如果要用TreeMap对Key进行排序,调用如下方法:

  final int compare(Object k1, Object k2) {return comparator==null ? ((Comparable<? super K>)k1).compareTo((K)k2): comparator.compare((K)k1, (K)k2);}

如果 comparator 不为null, 优先使用 comparator 的compare方法;
如果为null, 则使用Key实现的自然排序Comparable接口的 compareTo 方法。如果两者都无法满足,则抛出异常;

Exception in thread "main" java.lang.ClassCastException: com.yaspeed2.TreeMapTest$Key cannot be cast to java.lang.Comparableat java.util.TreeMap.compare(TreeMap.java:1294)at java.util.TreeMap.put(TreeMap.java:538)at com.yaspeed2.TreeMapTest.main(TreeMapTest.java:9)

TreeMap 中判断两个key 相等的标准是: 两个key通过compareTo() 方法返回0,TreeMap 即认为这两个key是相等的。

如果使用自定义类作为TreeMap的key, 且让TreeMap 良好的工作,则重写该类的equals() 方法和compareTo() 方法时应保持一致的返回结果: 两个key 通过equals() 方法比较返回true时,他们通过compareTo() 返回比较应该返回0。如果equals()方法与compareTo()方法的返回结果不一致,TreeMap与Map接口的规则就会冲突。

Java TreeMap的使用相关推荐

  1. java中map的put方法,Java TreeMap put()方法

    Java TreeMap put()方法 java.util.TreeMap.put() 在Map中插入具有指定键的指定值. 1 语法 public V put(K key,V value) 2 参数 ...

  2. java treemap value排序_Java TreeMap升序|降序排列和按照value进行排序的案例

    TreeMap 升序|降序排列 import java.util.Comparator; import java.util.TreeMap; public class Main { public st ...

  3. java treemap字母排序_Java TreeMap对数字,英文字母,汉字等排序例子

    首页 > 基础教程 > 集合框架 > TreeMap类 Java TreeMap对数字,英文字母,汉字等排序例子 1. 对于一些简单的数字,英文字母等排序 TreeMap hm = ...

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

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

  5. java map comparator,Java TreeMap comparator()方法

    Java TreeMap comparator()方法 java.util.TreeMap.comparator() 返回按顺序排列键的比较器:如果映射使用自然顺序,则返回null. 1 语法 pub ...

  6. java treemap用法_Java TreeMap put()用法及代码示例

    TreeMap的java.util.TreeMap.put()方法用于将映射插入Map.这意味着我们可以将特定的键及其映射到的值插入到特定的映射中.如果传递了现有键,则以前的值将被新值替换.如果传递了 ...

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

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

  8. java TreeMap 源代码分析 平衡二叉树

    TreeMap 的实现就是红黑树数据结构,也就说是一棵自平衡的排序二叉树,这样就可以保证当需要快速检索指定节点. TreeSet 和 TreeMap 的关系 为了让大家了解 TreeMap 和 Tre ...

  9. java TreeMap用法

    最近工作遇到需要按一个model中不同的列进行排序的问题,查了一下JDK API文档,发现,java中可以排序的工具类和接口共有五个SortedMap .SortedSet.TreeMap .Tree ...

  10. Java TreeMap 源码解析

    继上篇文章介绍完了HashMap,这篇文章开始介绍Map系列另一个比较重要的类TreeMap. 大家也许能感觉到,网络上介绍HashMap的文章比较多,但是介绍TreeMap反而不那么多,这里面是有原 ...

最新文章

  1. 【BLE MIDI】MIDI 文件格式分析总结 ★★★
  2. KM(知识管理)与SharePoint Portal
  3. Semantic UI实现一个landing page
  4. c++计算数组均值方差_协方差分析的基本思想和应用前提(上)
  5. CodeFirst的EF6迁移和时间戳错误
  6. bug篇——generator逆向出现配置文件不存在
  7. Python基础--02
  8. 全网首发:神奇的WORD文字渲染效果,18个字符一组,每个字符渲染效果不同
  9. MATPOWER中case文件的编写经验与技巧
  10. JavaScript高级程序设计(第三版)阅读笔记
  11. 【通过】华为OD机试真题59:叠积木
  12. 目录 如何成为一个合格的段子手
  13. 参考 | 升级 Win11 移动热点开不了或者开了连不上
  14. 知识图谱学习资料汇总
  15. bootstrap 修改carousel 样式
  16. 彻底卸载JDK的-并只依赖配置环境安装JDK(不依赖注册表)-解决Error opening registry key‘software\Javasoft\Java Runti问题
  17. 1028: 安全路径(2014年中南大学研究生复试机试题 )
  18. 【转】PCL室内三维重建
  19. 【VINS-Mono】Estimator::initialStructure
  20. 揭秘认知智能,小i机器人的“高级知识分析师”高级在哪里?

热门文章

  1. Microsoft Edge浏览器打不开
  2. 黑鱼资源完整模板分享 已本地化CSS JS
  3. 计算机硬件系统设计—码表数码管显示驱动设计
  4. wps论文参考文献变动时自动更新
  5. linux vdso(Virtual Dynamically-linked Shared Object)内核态的调用映射到用户态的地址空间开销更小
  6. 按键精灵定位坐标循环_LinkTrack UWB定位正式支持ROS机器人操作系统,驱动开源,自由定制消息格式...
  7. AAAI 2022主题论文推荐——Semantic Segmentation
  8. js vue 根据城市名称 按A-Z进行排序展示
  9. Linux内核分析 笔记二 操作系统是如何工作的 ——by王玥
  10. 互联网之父赛弗:互联网仍很年轻