一.TreeMap的简介
TreeMap是一个有序的key-value集合,基于红黑树(Red-Black tree)的 NavigableMap实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator进行排序,具体取决于使用的构造方法。

下面简单介绍一下 红黑树:

  1. 根节点是黑色
  2. 每个节点都只能是红色或者黑色
  3. 每个叶节点(NIL节点,空节点)是黑色的。
  4. 如果一个节点是红色的,则它两个子节点都是黑色的,也就是说在一条路径上不能出现两个红色的节点。
  5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

二.TreeMap的继承关系

类 TreeMap<K,V>java.lang.Object继承者 java.util.AbstractMap<K,V>继承者 java.util.TreeMap<K,V>
类型参数:
K - 此映射维护的键的类型
V - 映射值的类型

继承AbstactMap类,则TreeMap是一个Map,具体key-value特性的集合!

实现了Navigable接口,意味着它支持一系列的导航方法,如有序的key返回。

实现了Cloneable接口,意味着它能被克隆。

实现了Serializable接口,意味着它支持序列化。

三.TreeMap的API
Tree API

1:构造方法

TreeMap() 使用键的自然顺序构造一个新的、空的树映射。
TreeMap(Comparator<? super K> comparator) 构造一个新的、空的树映射,该映射根据给定比较器进行排序。
TreeMap(Map<? extends K,? extends V> m) 构造一个与给定映射具有相同映射关系的新的树映射,该映射根据其键的自然顺序 进行排序。
TreeMap(SortedMap<K,? extends V> m) 构造一个与指定有序映射具有相同映射关系和相同排序顺序的新的树映射。

2:方法

 Map.Entry<K,V> ceilingEntry(K key) 返回一个键-值映射关系,它与大于等于给定键的最小键关联;如果不存在这样的键,则返回 null。K  ceilingKey(K key) 返回大于等于给定键的最小键;如果不存在这样的键,则返回 null。void   clear() 从此映射中移除所有映射关系。Object clone() 返回此 TreeMap 实例的浅表副本。Comparator<? super K>  comparator() 返回对此映射中的键进行排序的比较器;如果此映射使用键的自然顺序,则返回 null。boolean    containsKey(Object key) 如果此映射包含指定键的映射关系,则返回 true。boolean    containsValue(Object value) 如果此映射为指定值映射一个或多个键,则返回 true。NavigableSet<K>    descendingKeySet() 返回此映射中所包含键的逆序 NavigableSet 视图。NavigableMap<K,V>  descendingMap() 返回此映射中所包含映射关系的逆序视图。Set<Map.Entry<K,V>>    entrySet() 返回此映射中包含的映射关系的 Set 视图。Map.Entry<K,V> firstEntry() 返回一个与此映射中的最小键关联的键-值映射关系;如果映射为空,则返回 null。K  firstKey() 返回此映射中当前第一个(最低)键。Map.Entry<K,V> floorEntry(K key) 返回一个键-值映射关系,它与小于等于给定键的最大键关联;如果不存在这样的键,则返回 null。K  floorKey(K key) 返回小于等于给定键的最大键;如果不存在这样的键,则返回 null。V  get(Object key) 返回指定键所映射的值,如果对于该键而言,此映射不包含任何映射关系,则返回 null。SortedMap<K,V> headMap(K toKey) 返回此映射的部分视图,其键值严格小于 toKey。NavigableMap<K,V>  headMap(K toKey, boolean inclusive) 返回此映射的部分视图,其键小于(或等于,如果 inclusive 为 true)toKey。Map.Entry<K,V> higherEntry(K key) 返回一个键-值映射关系,它与严格大于给定键的最小键关联;如果不存在这样的键,则返回 null。K  higherKey(K key) 返回严格大于给定键的最小键;如果不存在这样的键,则返回 null。Set<K> keySet() 返回此映射包含的键的 Set 视图。Map.Entry<K,V> lastEntry() 返回与此映射中的最大键关联的键-值映射关系;如果映射为空,则返回 null。K  lastKey() 返回映射中当前最后一个(最高)键。Map.Entry<K,V> lowerEntry(K key) 返回一个键-值映射关系,它与严格小于给定键的最大键关联;如果不存在这样的键,则返回 null。K  lowerKey(K key) 返回严格小于给定键的最大键;如果不存在这样的键,则返回 null。NavigableSet<K>    navigableKeySet() 返回此映射中所包含键的 NavigableSet 视图。Map.Entry<K,V> pollFirstEntry() 移除并返回与此映射中的最小键关联的键-值映射关系;如果映射为空,则返回 null。Map.Entry<K,V> pollLastEntry() 移除并返回与此映射中的最大键关联的键-值映射关系;如果映射为空,则返回 null。V  put(K key, V value) 将指定值与此映射中的指定键进行关联。void   putAll(Map<? extends K,? extends V> map) 将指定映射中的所有映射关系复制到此映射中。V  remove(Object key) 如果此 TreeMap 中存在该键的映射关系,则将其删除。int    size() 返回此映射中的键-值映射关系数。NavigableMap<K,V>  subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) 返回此映射的部分视图,其键的范围从 fromKey 到 toKey。SortedMap<K,V> subMap(K fromKey, K toKey) 返回此映射的部分视图,其键值的范围从 fromKey(包括)到 toKey(不包括)。SortedMap<K,V> tailMap(K fromKey) 返回此映射的部分视图,其键大于等于 fromKey。NavigableMap<K,V>  tailMap(K fromKey, boolean inclusive) 返回此映射的部分视图,其键大于(或等于,如果 inclusive 为 true)fromKey。Collection<V>  values() 返回此映射包含的值的 Collection 视图。

四.源码

源码和16基本相同,这里不做分析,可以查看参考文章。里面有详细的介绍!

五.总结

1、TreeMap是根据key进行排序的,它的排序和定位需要依赖比较器或覆写Comparable接口,也因此不需要key覆写hashCode方法和equals方法,就可以排除掉重复的key,而HashMap的key则需要通过覆写hashCode方法和equals方法来确保没有重复的key。

2、TreeMap的查询、插入、删除效率均没有HashMap高,一般只有要对key排序时才使用TreeMap。

3、TreeMap的key不能为null,而HashMap的key可以为null。

4、TreeMap不是同步的。如果多个线程同时访问一个映射,并且其中至少一个线程从结构上修改了该映射,则其必须 外部同步。

SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));

参考文章:
1:【数据结构与算法】二叉排序树C实现(含完整源码)
2:红黑树(一)之 原理和算法详细介绍
3: TreeMap源码剖析
4:TreeMap详细介绍(源码解析)和使用示例


欢迎访问我的csdn博客,我们一同成长!

"不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!"

博客首页:http://blog.csdn.net/u010648555

转载于:https://www.cnblogs.com/aflyun/p/6506677.html

java集合系列——Map之TreeMap介绍(九)相关推荐

  1. java集合系列——java集合概述(一)

    在JDK中集合是很重要的,学习java那么一定要好好的去了解一下集合的源码以及一些集合实现的思想! 一:集合的UML类图(网上下载的图片) Java集合工具包位置是java.util.* 二:集合工具 ...

  2. Java 集合系列目录(Category)

    Java 集合系列目录(Category) 转自:Java 集合系列目录(Category) 01. Java 集合系列01之 总体框架 02. Java 集合系列02之 Collection架构 0 ...

  3. Java 集合系列 16 HashSet

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  4. 新手菜鸟 Java 集合系列目录(Category)

    Java 集合系列01之 总体框架 http://www.cnblogs.com/skywang12345/p/3308498.html (笔记:Java集合是java提供的工具包,包含了常用的数据结 ...

  5. Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例

    转载自  Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 第1部分 ArrayList介绍 ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组.与 ...

  6. Java 集合系列02之 Collection架构

    概要 首先,我们对Collection进行说明.下面先看看Collection的一些框架类的关系图: Java 集合系列02之 Collection架构 Collection是一个接口,它主要的两个分 ...

  7. Java 集合系列06: Vector深入解析

    戳上面的蓝字关注我们哦! 精彩内容 精选java等全套视频教程 精选java电子图书 大数据视频教程精选 java项目练习精选 概论 这是接着以前的文章分享的,这里给出以前的文章的连接,供小伙伴们回顾 ...

  8. Java 集合系列(一)

    Java集合系列文章将以思维导图为主要形式来展示知识点,让零碎的知识形成体系. 这篇文章主要介绍的是[Java 集合的基本知识],即Java 集合简介. 毕业出来一直使用 PHP 进行开发,对于大学所 ...

  9. Java 集合系列04之 fail-fast总结

    转载自   Java 集合系列04之 fail-fast总结 概要 前面,我们已经学习了ArrayList.接下来,我们以ArrayList为例,对Iterator的fail-fast机制进行了解.内 ...

  10. Java集合系列之四大常用集合(ArrayList、LinkedList、HashSet、HashMap)的用法

    Java集合系列之四大常用集合(ArrayList.LinkedList.HashSet.HashMap)的用法 ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是A ...

最新文章

  1. Centos 7环境下源码安装PostgreSQL数据库
  2. 深入Phtread(三):线程的同步-Condition Variables
  3. K.O. -------- Eclipse中Maven的报错处理
  4. JS:a=b=c,a=?
  5. 殷墟 太行山 红旗渠
  6. pca图像压缩python_基于PCA的图像降维及图像重构
  7. android studio中断,Android Studio是否有任何修复方法可以在Macbook Pro中断开测试设备的连接?...
  8. asp.net core mvc 管道之中间件
  9. Flash缺货,存储器成为三星的摇钱树
  10. 解决报错(4种情况):0x00007FF614F73B96 处(位于 XXX.exe 中)引发的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 0x000XXX
  11. Excel空值导入mysql_excel导入sqlserver时,数据为null的处理方法分享
  12. Matlab遗传算法大纲
  13. 极域电子教室解控方法
  14. Android实现抖音无水印视频
  15. 领扣LintCode算法问题答案-1485. 圣杯咒语
  16. DreamweaverCS6 - BUG(2) —— 编辑浏览器列表无法添加浏览器
  17. Excel 2007 设置每页打印标题
  18. Linux系统的下载神器XDM
  19. 华为日历登录qq邮箱的解决方案
  20. 计算机网络的通信方式

热门文章

  1. mysql ip 远程连接不上_【技术贴】解决MySql连接不上 ip远程连接Host is not allowed to conn-阿里云开发者社区...
  2. lol最克制诺手的英雄_LOL“英雄恐惧症”,当你上单遇到诺手时,你会用什么英雄对线...
  3. 教你chrome浏览器断点调试理解闭包
  4. 线段树扫描线(1---算矩形的总面积)
  5. 函数式编程与面向对象编程[1]: Lambda表达式 函数柯里化 高阶函数
  6. 总结2012,展望2013
  7. C# 用装饰模式实现蝌蚪变青蛙的过程-续
  8. MATLAB: 你不知道的12个基础知识
  9. 安装tensorflow时候报错ImportError: DLL load failed: 找不到指定的模块。Failed to load the native TensorFlow runtime.
  10. Practical Lessons from Predicting Clicks on Ads at Facebook