java集合系列——Map之TreeMap介绍(九)

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

大家好,又见面了,我是全栈君。

一.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详细介绍(源码解析)和使用示例

java集合系列——java集合概述(一)
java集合系列——List集合之ArrayList介绍(二)
java集合系列——List集合之LinkedList介绍(三)
java集合系列——List集合之Vector介绍(四)
java集合系列——List集合之Stack介绍(五)
java集合系列——List集合总结(六)
java集合系列——Map介绍(七)
java集合系列——Map之HashMap介绍(八)
java集合系列——Map之TreeMap介绍(九)
java集合系列——Set之HashSet和TreeSet介绍(十)



如果帅气(美丽)、睿智(聪颖),和我一样简单善良的你看到本篇博文中存在问题,请指出,我虚心接受你让我成长的批评,谢谢阅读!
祝你今天开心愉快!


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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121179.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【HashMap扩容机制】

    【HashMap扩容机制】我是廖志伟,一名Java开发工程师、幕后大佬社区创始人、Java领域优质创作者、CSDN博客专家。拥有多年一线研发经验,研究过各种常见框架及中间件的底层源码,对于大型分布式、微服务、三高架构(高性能、高并发、高可用)有过实践架构经验。博主:java_wxid社区:幕后大佬文章目录HashMap扩容机制本文的大概内容:HashMap扩容机制将(k1,v1)直接放入Node类型的数组中,这个数组初始化容量是16,默认的加载因子是0.75。HashMap有两个参数影响其性能:初始容量和加载.

    2022年6月26日
    25
  • 实现手机网页调起原生微信朋友圈分享的工具nativeShare.js

    实现手机网页调起原生微信朋友圈分享的工具nativeShare.js

    2021年10月28日
    40
  • 六十四卦详细解释_六十四卦断事

    六十四卦详细解释_六十四卦断事文章目录第1卦 乾为天(乾卦) 刚健中正 上上卦第2卦 坤为地(坤卦) 柔顺伸展 上上卦第3卦 水雷屯(屯卦) 起始维艰 下下卦第4卦 山水蒙(蒙卦) 启蒙奋发 中下卦第5卦 水天需(需卦) 守正待机 中上卦第6卦 天水讼(讼卦) 慎争戒讼 中下卦第7卦 地水师(师卦) 行险而顺 中上卦第8卦 水地比(比卦) 诚信团结 上上卦第9卦 风天小畜(小畜卦) 蓄养待进 下下卦第10卦 天泽履(履卦) 脚…

    2022年8月18日
    11
  • 新人如何入行3D游戏建模

    新人如何入行3D游戏建模所有行业都是一样的,没有什么容易的,只不过这一行是偏向于技术的,一个有好的建模师月薪10k+是很常见的,这个需要有自己刻苦学习的成果。游戏建模前景在游戏模型行业,你基本不用担心找不到工作,因为游戏模型师人才缺口非常大。举个例子:游戏制作公司的人员配比大多数是这样的:比如100人的三维制作组,可能有60人在做模型贴图,10个人在K动画。只要你保证技能在手,一定是抢手的人才。在几年前游戏建模这个行业不仅仅缺人才,甚至连新手都非常稀缺,那个时候公司愿意招聘实习生,培养他们然后给公司干活,但是工资一定不会给开的很

    2022年5月12日
    49
  • COleVariant 和 CTime「建议收藏」

    COleVariant 和 CTime「建议收藏」获取当前时间。datetime=COleDateTime::GetCurrentTime();CTime和COleDateTime具有几乎同样的功能。与CTime相比,COleDateTime的优点在于它支持DWORD变量。COleDateTime使用的位数是双浮点的两倍,既然CTime只是简单地计算从1970年1月1日之后经过的秒数,所以到了2037年它将达到429496

    2022年7月18日
    16
  • ASP.NET DropDownList1_SelectedIndexChanged使用

    ASP.NET DropDownList1_SelectedIndexChanged使用DropDownList1.AutoPostBack属性今天写代码给DropDownList1添加DropDownList1_SelectedIndexChanged事件,在运行测试时发现DropDownList1的index发生改变后DropDownList1_SelectedIndexChanged没有执行,查了一下DropDownList1的属性才知道AutoPostBack要设置…

    2022年7月18日
    13

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号