Java TreeMap 介绍和使用
转自: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的构造函数
- // 默认构造函数。使用该构造函数,TreeMap中的元素按照自然排序进行排列。
- TreeMap()
- // 创建的TreeMap包含Map
- TreeMap(Map<? extends K, ? extends V> copyFrom)
- // 指定Tree的比较器
- TreeMap(Comparator<? super K> comparator)
- // 创建的TreeSet包含copyFrom
- TreeMap(SortedMap<K, ? extends V> copyFrom)
TreeMap的API
- 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 视图。
第2部分 TreeMap数据结构
TreeMap的继承关系
- java.lang.Object
- ↳ java.util.AbstractMap<K, V>
- ↳ java.util.TreeMap<K, V>
- public class TreeMap<K,V>
- extends AbstractMap<K,V>
- 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迭代器遍历“第一步”得到的集合。
- // 假设map是TreeMap对象
- // map中的key是String类型,value是Integer类型
- Integer integ = null;
- Iterator iter = map.entrySet().iterator();
- while(iter.hasNext()) {
- Map.Entry entry = (Map.Entry)iter.next();
- // 获取key
- key = (String)entry.getKey();
- // 获取value
- integ = (Integer)entry.getValue();
- }
3.2 遍历TreeMap的键
第一步:根据keySet()获取TreeMap的“键”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。
- // 假设map是TreeMap对象
- // map中的key是String类型,value是Integer类型
- String key = null;
- Integer integ = null;
- Iterator iter = map.keySet().iterator();
- while (iter.hasNext()) {
- // 获取key
- key = (String)iter.next();
- // 根据key,获取value
- integ = (Integer)map.get(key);
- }
3.3 遍历TreeMap的值
第一步:根据value()获取TreeMap的“值”的集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。
- // 假设map是TreeMap对象
- // map中的key是String类型,value是Integer类型
- Integer value = null;
- Collection c = map.values();
- Iterator iter= c.iterator();
- while (iter.hasNext()) {
- value = (Integer)iter.next();
- }
Java TreeMap 介绍和使用的更多相关文章
- java集合介绍(List,Set,Map)
前言 介绍java的常用集合+各个集合使用用例 欢迎转载,请注明作者和出处哦☺ 参考: 1,<Java核心编程技术(第二版)> 2, http://www.cnblogs.com/Litt ...
- Android下HelloWorld项目的R.java文件介绍
R.java文件介绍 HelloWorld工程中的R.java文件 package com.android.hellworld; public final class R { public s ...
- 深入Java虚拟机读书笔记第一章Java体系结构介绍
第1章 Java体系结构介绍 Java技术核心:Java虚拟机 Java:安全(先天防bug的设计.内存).健壮.平台无关.网络无关(底层结构上,对象序列化和RMI为分布式系统中各个部分共享对象提供了 ...
- Java学习介绍
Java版本介绍 JavaME:微型版,用于开发小型设备.智能卡.移动终端应用(使用率较低) JavaSE:标准版,用于创建桌面应用(企业用JavaSE创建桌面应用较少) JavaEE:企业版,用于创 ...
- 流行的9个Java框架介绍: 优点、缺点等等
流行的9个Java框架介绍: 优点.缺点等等 在 2018年,Java仍然是世界上最流行的编程语言.它拥有一个巨大的生态系统,在全世界有超过900万Java开发人员.虽然Java不是最直接的语言,但是 ...
- Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试【转】
Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试[转] 本文是本人前一段时间做一个简单Java监控工具调研总 ...
- Java TreeMap 和 LinkedHashMap【笔记】
Java TreeMap 和 LinkedHashMap[笔记] TreeMap TreeMap基本结构 TreeMap 底层的数据结构就是红黑树,和 HashMap 的红黑树结构一样 与HashMa ...
- java JNI介绍
java JNI介绍 目录 java JNI介绍 1. Java调用C++代码 2.C++代码调用java代码 JNI是Java Native Interface的全称. oracle文档中是这样描述 ...
- Java秘诀!Java逻辑运算符介绍
运算符丰富是 Java 语言的主要特点之一,它提供的运算符数量之多,在高级语言中是少见的. Java 语言中的运算符除了具有优先级之外,还有结合性的特点.当一个表达式中出现多种运算符时,执行的先后顺序 ...
随机推荐
- Batch Normalization的算法本质是在网络每一层的输入前增加一层BN层(也即归一化层),对数据进行归一化处理,然后再进入网络下一层,但是BN并不是简单的对数据进行求归一化,而是引入了两个参数λ和β去进行数据重构
Batch Normalization Batch Normalization是深度学习领域在2015年非常热门的一个算法,许多网络应用该方法进行训练,并且取得了非常好的效果. 众所周知,深度学习是应 ...
- oracle 实时查询最耗CPU资源的SQL语句
1. 先通过top命令查看产用资源较多的spid号 2.查询当前耗时的会话ID,用户名,sqlID等: select sid,serial#,machine,username,program,sql_ ...
- 锋利Jquery 第一天
之前一直学习,现在终于有时间来整理一下文档了. 以下文章都是自己学习Jquery 的笔记, 希望能留下痕迹,也希望能帮助到您. 好了开始我的Jquery第一天. 我也是从Hello wrod!开始的 ...
- 13.ubuntu下Qt5无法使用中文的问题解决
1.首先安装fcitx-frontend-qt5 sudo apt-get install fcitx-frontend-qt5 这个应该是默认安装的,然后查看fcitx-frontend-qt5 的 ...
- c#中集成Swagger
Swagger是什么? 官方说法:Swagger是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文 ...
- genemotion
genemotion 问题 https://blog.csdn.net/beiminglei/article/details/17399333 https://www.jianshu.com/p/f8 ...
- Photoshop把图片调成固定的像素。
1.用PhotoShop打开需要修改的图片. 2.点击“窗口”菜单的“图层”子菜单,打开图层控制面板(快捷键F7).3.用鼠标左键双击“图层”面板的“背景”图层.在弹出窗口中点击“确定”按钮,解锁背景 ...
- Type system-Type checking
类型系统的属性: 1.结构属性: 2.规则属性:类型系统定义了一套规则(内部数据的访问规则.函数的访问规则.类型的比较与转化规则),以供编译和运行时进行检查. In programming langu ...
- luoguP1390 公约数的和 数学推导_双倍经验
Code: #include <bits/stdc++.h> #include <tr1/unordered_map> #define setIO(s) freopen(s&q ...
- layui select change
<select lay-filter="test"></select> layui.use([ 'form'], function() { var form ...