转自:https://www.cnblogs.com/skywang12345/p/3310928.html

概要

这一章,我们对TreeMap进行学习。
我们先对TreeMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeMap。内容包括:
第1部分 TreeMap介绍
第2部分 TreeMap数据结构
第3部分 TreeMap遍历方式

转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3310928

第1部分 TreeMap介绍

TreeMap 简介

TreeMap 是一个有序的key-value集合,它是通过红黑树实现的。
TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合。
TreeMap 实现了NavigableMap接口,意味着它支持一系列的导航方法。比如返回有序的key集合。
TreeMap 实现了Cloneable接口,意味着它能被克隆
TreeMap 实现了java.io.Serializable接口,意味着它支持序列化

TreeMap基于红黑树(Red-Black tree)实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
TreeMap的基本操作 containsKey、get、put 和 remove 的时间复杂度是 log(n) 。
另外,TreeMap是非同步的。 它的iterator 方法返回的迭代器是fail-fastl的。

TreeMap的构造函数

  1. // 默认构造函数。使用该构造函数,TreeMap中的元素按照自然排序进行排列。
  2. TreeMap()
  3. // 创建的TreeMap包含Map
  4. TreeMap(Map<? extends K, ? extends V> copyFrom)
  5. // 指定Tree的比较器
  6. TreeMap(Comparator<? super K> comparator)
  7. // 创建的TreeSet包含copyFrom
  8. TreeMap(SortedMap<K, ? extends V> copyFrom)

TreeMap的API

  1. Map.Entry<K,V>    ceilingEntry(K key)
  2. 返回一个键-值映射关系,它与大于等于给定键的最小键关联;如果不存在这样的键,则返回 null。
  3. K   ceilingKey(K key)
  4. 返回大于等于给定键的最小键;如果不存在这样的键,则返回 null。
  5. void    clear()
  6. 从此映射中移除所有映射关系。
  7. Object  clone()
  8. 返回此 TreeMap 实例的浅表副本。
  9. Comparator<? super K> comparator()
  10. 返回对此映射中的键进行排序的比较器;如果此映射使用键的自然顺序,则返回 null。
  11. boolean containsKey(Object key)
  12. 如果此映射包含指定键的映射关系,则返回 true。
  13. boolean containsValue(Object value)
  14. 如果此映射为指定值映射一个或多个键,则返回 true。
  15. NavigableSet<K>   descendingKeySet()
  16. 返回此映射中所包含键的逆序 NavigableSet 视图。
  17. NavigableMap<K,V> descendingMap()
  18. 返回此映射中所包含映射关系的逆序视图。
  19. Set<Map.Entry<K,V>> entrySet()
  20. 返回此映射中包含的映射关系的 Set 视图。
  21. Map.Entry<K,V>    firstEntry()
  22. 返回一个与此映射中的最小键关联的键-值映射关系;如果映射为空,则返回 null。
  23. K   firstKey()
  24. 返回此映射中当前第一个(最低)键。
  25. Map.Entry<K,V>    floorEntry(K key)
  26. 返回一个键-值映射关系,它与小于等于给定键的最大键关联;如果不存在这样的键,则返回 null。
  27. K   floorKey(K key)
  28. 返回小于等于给定键的最大键;如果不存在这样的键,则返回 null。
  29. V   get(Object key)
  30. 返回指定键所映射的值,如果对于该键而言,此映射不包含任何映射关系,则返回 null。
  31. SortedMap<K,V>    headMap(K toKey)
  32. 返回此映射的部分视图,其键值严格小于 toKey。
  33. NavigableMap<K,V> headMap(K toKey, boolean inclusive)
  34. 返回此映射的部分视图,其键小于(或等于,如果 inclusive 为 true)toKey。
  35. Map.Entry<K,V>    higherEntry(K key)
  36. 返回一个键-值映射关系,它与严格大于给定键的最小键关联;如果不存在这样的键,则返回 null。
  37. K   higherKey(K key)
  38. 返回严格大于给定键的最小键;如果不存在这样的键,则返回 null。
  39. Set<K>    keySet()
  40. 返回此映射包含的键的 Set 视图。
  41. Map.Entry<K,V>    lastEntry()
  42. 返回与此映射中的最大键关联的键-值映射关系;如果映射为空,则返回 null。
  43. K   lastKey()
  44. 返回映射中当前最后一个(最高)键。
  45. Map.Entry<K,V>    lowerEntry(K key)
  46. 返回一个键-值映射关系,它与严格小于给定键的最大键关联;如果不存在这样的键,则返回 null。
  47. K   lowerKey(K key)
  48. 返回严格小于给定键的最大键;如果不存在这样的键,则返回 null。
  49. NavigableSet<K>   navigableKeySet()
  50. 返回此映射中所包含键的 NavigableSet 视图。
  51. Map.Entry<K,V>    pollFirstEntry()
  52. 移除并返回与此映射中的最小键关联的键-值映射关系;如果映射为空,则返回 null。
  53. Map.Entry<K,V>    pollLastEntry()
  54. 移除并返回与此映射中的最大键关联的键-值映射关系;如果映射为空,则返回 null。
  55. V   put(K key, V value)
  56. 将指定值与此映射中的指定键进行关联。
  57. void    putAll(Map<? extends K,? extends V> map)
  58. 将指定映射中的所有映射关系复制到此映射中。
  59. V   remove(Object key)
  60. 如果此 TreeMap 中存在该键的映射关系,则将其删除。
  61. int size()
  62. 返回此映射中的键-值映射关系数。
  63. NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)
  64. 返回此映射的部分视图,其键的范围从 fromKey 到 toKey。
  65. SortedMap<K,V>    subMap(K fromKey, K toKey)
  66. 返回此映射的部分视图,其键值的范围从 fromKey(包括)到 toKey(不包括)。
  67. SortedMap<K,V>    tailMap(K fromKey)
  68. 返回此映射的部分视图,其键大于等于 fromKey。
  69. NavigableMap<K,V> tailMap(K fromKey, boolean inclusive)
  70. 返回此映射的部分视图,其键大于(或等于,如果 inclusive 为 true)fromKey。
  71. Collection<V> values()
  72. 返回此映射包含的值的 Collection 视图。

第2部分 TreeMap数据结构

TreeMap的继承关系

  1. java.lang.Object
  2. ↳     java.util.AbstractMap<K, V>
  3. ↳     java.util.TreeMap<K, V>
  4. public class TreeMap<K,V>
  5. extends AbstractMap<K,V>
  6. implements NavigableMap<K,V>, Cloneable, java.io.Serializable {}

TreeMap与Map关系如下图:

从图中可以看出:
(01) TreeMap实现继承于AbstractMap,并且实现了NavigableMap接口。
(02) TreeMap的本质是R-B Tree(红黑树),它包含几个重要的成员变量: root, size, comparator。
  root 是红黑数的根节点。它是Entry类型,Entry是红黑数的节点,它包含了红黑数的6个基本组成成分:key(键)、value(值)、left(左孩子)、right(右孩子)、parent(父节点)、color(颜色)。Entry节点根据key进行排序,Entry节点包含的内容为value。 
  红黑数排序时,根据Entry中的key进行排序;Entry中的key比较大小是根据比较器comparator来进行判断的。
  size是红黑数中节点的个数。

关于红黑数的具体算法,请参考"红黑树(一) 原理和算法详细介绍"。

第3部分 TreeMap遍历方式

3.1 遍历TreeMap的键值对

第一步:根据entrySet()获取TreeMap的“键值对”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。

  1. // 假设map是TreeMap对象
  2. // map中的key是String类型,value是Integer类型
  3. Integer integ = null;
  4. Iterator iter = map.entrySet().iterator();
  5. while(iter.hasNext()) {
  6. Map.Entry entry = (Map.Entry)iter.next();
  7. // 获取key
  8. key = (String)entry.getKey();
  9. // 获取value
  10. integ = (Integer)entry.getValue();
  11. }

3.2 遍历TreeMap的键

第一步:根据keySet()获取TreeMap的“键”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。

  1. // 假设map是TreeMap对象
  2. // map中的key是String类型,value是Integer类型
  3. String key = null;
  4. Integer integ = null;
  5. Iterator iter = map.keySet().iterator();
  6. while (iter.hasNext()) {
  7. // 获取key
  8. key = (String)iter.next();
  9. // 根据key,获取value
  10. integ = (Integer)map.get(key);
  11. }

3.3 遍历TreeMap的值

第一步:根据value()获取TreeMap的“值”的集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。

    1. // 假设map是TreeMap对象
    2. // map中的key是String类型,value是Integer类型
    3. Integer value = null;
    4. Collection c = map.values();
    5. Iterator iter= c.iterator();
    6. while (iter.hasNext()) {
    7. value = (Integer)iter.next();
    8. }

Java TreeMap 介绍和使用的更多相关文章

  1. java集合介绍(List,Set,Map)

    前言 介绍java的常用集合+各个集合使用用例 欢迎转载,请注明作者和出处哦☺ 参考: 1,<Java核心编程技术(第二版)> 2, http://www.cnblogs.com/Litt ...

  2. Android下HelloWorld项目的R.java文件介绍

    R.java文件介绍 HelloWorld工程中的R.java文件 package com.android.hellworld; public final class R {     public s ...

  3. 深入Java虚拟机读书笔记第一章Java体系结构介绍

    第1章 Java体系结构介绍 Java技术核心:Java虚拟机 Java:安全(先天防bug的设计.内存).健壮.平台无关.网络无关(底层结构上,对象序列化和RMI为分布式系统中各个部分共享对象提供了 ...

  4. Java学习介绍

    Java版本介绍 JavaME:微型版,用于开发小型设备.智能卡.移动终端应用(使用率较低) JavaSE:标准版,用于创建桌面应用(企业用JavaSE创建桌面应用较少) JavaEE:企业版,用于创 ...

  5. 流行的9个Java框架介绍: 优点、缺点等等

    流行的9个Java框架介绍: 优点.缺点等等 在 2018年,Java仍然是世界上最流行的编程语言.它拥有一个巨大的生态系统,在全世界有超过900万Java开发人员.虽然Java不是最直接的语言,但是 ...

  6. Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试【转】

    Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试[转] 本文是本人前一段时间做一个简单Java监控工具调研总 ...

  7. Java TreeMap 和 LinkedHashMap【笔记】

    Java TreeMap 和 LinkedHashMap[笔记] TreeMap TreeMap基本结构 TreeMap 底层的数据结构就是红黑树,和 HashMap 的红黑树结构一样 与HashMa ...

  8. java JNI介绍

    java JNI介绍 目录 java JNI介绍 1. Java调用C++代码 2.C++代码调用java代码 JNI是Java Native Interface的全称. oracle文档中是这样描述 ...

  9. Java秘诀!Java逻辑运算符介绍

    运算符丰富是 Java 语言的主要特点之一,它提供的运算符数量之多,在高级语言中是少见的. Java 语言中的运算符除了具有优先级之外,还有结合性的特点.当一个表达式中出现多种运算符时,执行的先后顺序 ...

随机推荐

  1. BZOJ 3160: 万径人踪灭 FFT+快速幂+manacher

    BZOJ 3160: 万径人踪灭 题目传送门 [题目大意] 给定一个长度为n的01串,求有多少个回文子序列? 回文子序列是指从原串中找出任意个,使得构成一个回文串,并且位置也是沿某一对称轴对称. 假如 ...

  2. 杂项-电信:TL9000

    ylbtech-杂项-电信:TL9000 TL9000是电信业质量体系要求(书1)与质量体系法则(书2)的指南, 它包括ISO9001的所有要求,以及硬件.软件, 服务方面行业的特别要求. 这些新增要 ...

  3. c++面向对象程序设计 谭浩强 第一章答案

    c++面向对象程序设计 谭浩强 答案 第一章 目录: c++面向对象程序设计 谭浩强 答案 第一章 c++面向对象程序设计 谭浩强 答案 第二章 c++面向对象程序设计 谭浩强 答案 第三章 c++面 ...

  4. Kylin基础教程(二)

    近期先把Kylin教程整理完毕,后续根据大家需求(可能会发起投票),整理其他技术栈知识教程. OK,那么接上一篇文章,感性认知了Kylin之后,我们先来看一下如何部署Kylin吧. 序号也依然沿用上一 ...

  5. 五步完成一个 VSCode 扩展(插件)开发

    第一步: 安装扩展生成器 npm install -g yo generator-code vsce 第二步: 初始化一个 Hello World 扩展 yo code 图来自 CN-VScode-D ...

  6. mock non-virtual methods

    生产代码中有很多类方法是非虚的,而为了在Gtest中解除这些非必需的依赖,可以通过Gmock的mock non-virtual methods using templates方法来达到目的.在此之前, ...

  7. socket代码(简单)

    SERVER: #!/usr/bin/python # -*- coding: utf-8 -*- import socket import time s = socket.socket(socket ...

  8. Pyhton学习——Day28

    #上下文协议:文件操作时使用with执行# with open('a.txt','w',encoding='utf-8') as f1:# with语句,为了让一个对象兼容with语句,必须在这个对象 ...

  9. HDU 4725 The Shortest Path in Nya Graph [构造 + 最短路]

    HDU - 4725 The Shortest Path in Nya Graph http://acm.hdu.edu.cn/showproblem.php?pid=4725 This is a v ...

  10. 基于better-scroll封装一个上拉加载下拉刷新组件

    1.起因 上拉加载和下拉刷新在移动端项目中是很常见的需求,遂自己便基于better-scroll封装了一个下拉刷新上拉加载组件. 2.过程 better-scroll是目前比较好用的开源滚动库,提供很 ...