Java TreeMap的使用
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 有两种排序:
- 自然排序: TreeMap 的所有Key必须实现 Comparable 接口,而且所有的key应该是同一个类的对象,否则将会抛出 ClassCastException 异常。
- 定制排序: 创建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的使用相关推荐
- java中map的put方法,Java TreeMap put()方法
Java TreeMap put()方法 java.util.TreeMap.put() 在Map中插入具有指定键的指定值. 1 语法 public V put(K key,V value) 2 参数 ...
- java treemap value排序_Java TreeMap升序|降序排列和按照value进行排序的案例
TreeMap 升序|降序排列 import java.util.Comparator; import java.util.TreeMap; public class Main { public st ...
- java treemap字母排序_Java TreeMap对数字,英文字母,汉字等排序例子
首页 > 基础教程 > 集合框架 > TreeMap类 Java TreeMap对数字,英文字母,汉字等排序例子 1. 对于一些简单的数字,英文字母等排序 TreeMap hm = ...
- java treemap 排序原理,Java TreeMap排序算法实例
本文实例讲述了Java TreeMap排序算法.分享给大家供大家参考,具体如下: TreeMap 和 HashMap 用法大致相同,但实际需求中,我们需要把一些数据进行排序: 以前在项目中,从数据库查 ...
- java map comparator,Java TreeMap comparator()方法
Java TreeMap comparator()方法 java.util.TreeMap.comparator() 返回按顺序排列键的比较器:如果映射使用自然顺序,则返回null. 1 语法 pub ...
- java treemap用法_Java TreeMap put()用法及代码示例
TreeMap的java.util.TreeMap.put()方法用于将映射插入Map.这意味着我们可以将特定的键及其映射到的值插入到特定的映射中.如果传递了现有键,则以前的值将被新值替换.如果传递了 ...
- java treemap get_java treeMap 排序后 get不到value
代码如下importjava.util.*;publicclassmain{publicstaticvoidmain(String[]args){HashMapmap=newHashMap();Val ...
- java TreeMap 源代码分析 平衡二叉树
TreeMap 的实现就是红黑树数据结构,也就说是一棵自平衡的排序二叉树,这样就可以保证当需要快速检索指定节点. TreeSet 和 TreeMap 的关系 为了让大家了解 TreeMap 和 Tre ...
- java TreeMap用法
最近工作遇到需要按一个model中不同的列进行排序的问题,查了一下JDK API文档,发现,java中可以排序的工具类和接口共有五个SortedMap .SortedSet.TreeMap .Tree ...
- Java TreeMap 源码解析
继上篇文章介绍完了HashMap,这篇文章开始介绍Map系列另一个比较重要的类TreeMap. 大家也许能感觉到,网络上介绍HashMap的文章比较多,但是介绍TreeMap反而不那么多,这里面是有原 ...
最新文章
- 【BLE MIDI】MIDI 文件格式分析总结 ★★★
- KM(知识管理)与SharePoint Portal
- Semantic UI实现一个landing page
- c++计算数组均值方差_协方差分析的基本思想和应用前提(上)
- CodeFirst的EF6迁移和时间戳错误
- bug篇——generator逆向出现配置文件不存在
- Python基础--02
- 全网首发:神奇的WORD文字渲染效果,18个字符一组,每个字符渲染效果不同
- MATPOWER中case文件的编写经验与技巧
- JavaScript高级程序设计(第三版)阅读笔记
- 【通过】华为OD机试真题59:叠积木
- 目录 如何成为一个合格的段子手
- 参考 | 升级 Win11 移动热点开不了或者开了连不上
- 知识图谱学习资料汇总
- bootstrap 修改carousel 样式
- 彻底卸载JDK的-并只依赖配置环境安装JDK(不依赖注册表)-解决Error opening registry key‘software\Javasoft\Java Runti问题
- 1028: 安全路径(2014年中南大学研究生复试机试题 )
- 【转】PCL室内三维重建
- 【VINS-Mono】Estimator::initialStructure
- 揭秘认知智能,小i机器人的“高级知识分析师”高级在哪里?
热门文章
- Microsoft Edge浏览器打不开
- 黑鱼资源完整模板分享 已本地化CSS JS
- 计算机硬件系统设计—码表数码管显示驱动设计
- wps论文参考文献变动时自动更新
- linux vdso(Virtual Dynamically-linked Shared Object)内核态的调用映射到用户态的地址空间开销更小
- 按键精灵定位坐标循环_LinkTrack UWB定位正式支持ROS机器人操作系统,驱动开源,自由定制消息格式...
- AAAI 2022主题论文推荐——Semantic Segmentation
- js vue 根据城市名称 按A-Z进行排序展示
- Linux内核分析 笔记二 操作系统是如何工作的 ——by王玥
- 互联网之父赛弗:互联网仍很年轻