Java中的集合(十一) 实现Map接口的TreeMap
Java中的集合(十一) 实现Map接口的TreeMap
一、TreeMap简介(基于JDK1.8)
TreeMap是基于红黑树数据结构,是一个key-value的有序集合,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。因为红黑树是平衡的二叉搜索树,所以其put、get、remove的时间复杂度都为log(n)。
(一)、TreeMap与Map的关系
(二)、数据结构
红黑树操作包括插入、删除、左旋、右旋,这里有个可视化的红黑树操作网站,把这些操作都按动画做出来了,生动形象。
二、TreeMap的继承结构
(一)、继承结构
- TreeMap继承AbstractMap,实现了Map接口。Map是key-value键值对接口,所以具有Map接口的特性;
- 实现了NavigableMap接口,而NavigableMap接口继承了SortedMap接口,所以TreeMap具有一系列导航的方法,意味TreeMap是有序的键值对集合;
- 实现了Cloneable接口,意味着TreeMap可以被克隆;
- 实现了Serializable接口,意味着可以被序列化。
(二)、有序的实现
TreeMap实现了NavigableMap接口,NavigableMap是JDK1.6新增的,NavigableMap继承了SortedMap(这个Map是有序的),顺序一般是指由Comparable接口提供的keys的自然序,或者也可以在创建SortedMap实例时,指定一个Comparator来决定。插入SortedMap中的key的类都必须继承Comparable类(或指定一个comparator),这样才能通过k1.compareTo(k2)或comparator.compare(k1, k2)来比较两个key。
NavigableMap接口在SortedMap的基础上增加了一些导航方法来返回与搜索目标最近的元素。例如下面这些方法:
三、TreeMap的构造方法
四、TreeMap重要成员属性
TreeMap是基于R-B Tree(红黑树),它包含几个重要的成员变量: root,size,comparator。
(一)、root
root 是红黑数的根节点。它是Entry类型。Entry是TreeMap的内部类,实现了Map.Entry接口,是红黑树的节点,包含了红黑树的6个基本组成部分:key(键)、value(值)、left(左孩子)、right(右孩子)、parent(父节点)、color(颜色)。Entry节点根据key进行排序,Entry节点包含的内容为value。
(二)、size
是红黑数中节点的个数。
(三)、comparator
比较器,红黑数排序时,根据Entry中的key进行排序;Entry中的key比较大小是根据比较器comparator来进行判断的。
五、TreeMap的遍历
(一)、通过entrySet(),键值对遍历方式
①、首先通过entrySet方法获取键值对Set集合;
②、通过迭代器或者for-each循环遍历获得的Set集合
// 假设treeMap中的key是String类型,value是Integer类型
Set<Map.Entry<String,Integer>> set = treeMap.entrySet();
// 迭代器遍历
Iterator<Map.Entry<String,Integer>> it = set.iterator();
while(it.hasNext()) {
Map.Entry<String, Integer> entry = it.next();
String str = entry.getKey();
Integer i = entry.getValue();
} // for-each循环遍历
for (Map.Entry<String, Integer> entry : set) {
String str = entry.getKey();
Integer i = entry.getValue();
}
(二)、通过keySet(),键的遍历
①、首先通过keySet方法获取键的Set集合;
②、通过迭代器或者for-each循环遍历获得的Set集合
Set<String> set = treeMap.keySet();
Iterator<String> it = set.iterator();
while(it.hasNext()) {
String str = it.next();
}
(三)、通过value(),值的遍历
①、首先通过entrySet方法获取值的Set集合;
②、通过迭代器或者for-each循环遍历获得的Set集合
Collection<Integer> con = treeMap.values();
Iterator<Integer> it = con.iterator();
while(it.hasNext()) {
Integer i = it.next();
}
六、TreeMap常用API
七、TreeMap与HashMap异同
(一)、相同点
- 两者均是线程不安全的;增删改查操作的
- 两者插入节点时,key重复均覆盖旧值。
(二)、不同点
- 底层数据结构不同。HashMap是基于数组+链表+红黑树的数据结构,TreeMap是基于红黑树的数据结构。
- 有序无序。HashMap是无序的,TreeMap是有序的。
- null值情况。HashMap允许存储null,TreeMap的键不允许存储null,但是值可以为null。
- 操作时间不同。HashMap增删改查操作的时间复杂度为O(1),TreeMap增删改查的时间复杂度为O(log(n))。
- TreeMap要求key必须实现Comparable接口,或者初始化时传入Comparator比较器。
八、TreeMap与TreeSet的异同
TreeMap 是 Map 接口的实现类,而TreeSet 是 Set 接口的实现类。虽然 TreeMap 和TreeSet 实现的接口规范不同,但 TreeSet 底层是通过 TreeMap 来实现的(如同HashSet底层是是通过HashMap来实现、LinkedHashSet底层基于LinkedHashMap实现一样),因此二者的实现方式完全一样,都是红黑树算法。
(一)、相同点
- TreeMap和TreeSet都是有序的集合(仅仅key对象有序)。
- TreeMap和TreeSet都是非同步的,线程不安全的。可以通过Collections.synchroinzedMap()实现同步。
- 内部对元素的操作时间复杂度都是O(logN),而HashMap/HashSet/HashTable则为O(1)。
(二)、不同点
- 最主要的区别就是TreeSet和TreeMap分别实现Set和Map接口。
- TreeSet不能存储重复的元素,TreeMap除了键不能重复,但是值可以重复。
- TreeSet只存储一个对象(单列集合),而TreeMap存储两个对象Key和Value(仅仅key对象有序,双列集合)。
Java中的集合(十一) 实现Map接口的TreeMap的更多相关文章
- Java中的集合(十三) 实现Map接口的Hashtable
Java中的集合(十三) 实现Map接口的Hashtable 一.Hashtable简介 和HashMap一样,Hashtable采用“拉链法”实现一个哈希表,它存储的内容是键值对(key-value ...
- Java中的集合(十四) Map的实现类LinkedHashMap
Java中的集合(十四) Map的实现类LinkedHashMap 一.LinkedHashMap的简介 LinkedHashMap是Map接口的实现类,继承了HashMap,它通过重写父类相关的方法 ...
- Java中的集合(Set,List,Map)
******************collections类总结*************************** JAVA集合主要分为三种类型: Set(集) List(列表) ...
- Java学习--java中的集合框架、Collection接口、list接口
与数组相比:1.数组的长度固定,而集合的长度可变2.数组只能通过下表访问元素,类型固定,而有的集合可以通过任意类型查找所映射的具体对象 java集合框架:collection(list序列,queue ...
- C#与java中的集合区别
集合一般的操作 插入: add 删除: remove 查找: contains,remove java中的集合 注意哪些是接口,哪些是实现类 使用集合的时候 1. ...
- Java 中的集合接口——List、Set、Map
Java 中的集合接口——List.Set.Map 什么叫集合:集合就是Java API所提供的一系列类的实例,可以用于动态存放多个对象.这跟我们学过的数组差不多,那为什么我们还要学集合,我们看看数组 ...
- Java中的集合(十二) 实现Map接口的WeakHashMap
Java中的集合(十二) 实现Map接口的WeakHashMap 一.WeakHashMap简介 WeakHashMap和HashMap一样,WeakHashMap也是一个哈希表,存储的也是键值对(k ...
- Java中的集合(七)双列集合顶层接口------Map接口架构
Java中的集合(七)双列集合顶层接口------Map接口 一.Map接口的简介 通过List接口,我们知道List接口下的集合是单列集合,数据存储是单列的结构.Map接口下是一个键值对(key-v ...
- Java中的集合框架-Map
前两篇<Java中的集合框架-Commection(一)>和<Java中的集合框架-Commection(二)>把集合框架中的Collection开发常用知识点作了一下记录,从 ...
随机推荐
- C语言设计实验报告(二)
C程序设计实验报告姓 名:赖瑾 实验地点:家 实验时间:2020年3月9日 实验项目:2.3.3 字符与ASCLL码 2.3.4 运算符与表达式的运用 2.3.5 顺序结构应用程序 3.3.1 数学函 ...
- oracle如何实现去重和分页
一:oracle实现去重: user数据表: 分两步:1.查询重复数据 2.删除重复数据 1.查询重复数据:在oracle中实现查询重复数据,可以借助于rowid这个伪列.oracle中每个表物理上 ...
- 【FPGA篇章六】FPGA编译向导:详解编译预处理功能
欢迎大家关注我的微信公众账号,支持程序媛写出更多优秀的文章 Verilog HDL语言和C语言一样也提供了编译预处理功能. Verilog HDL允许在程序中使用特殊的编译预处理语句. 在编译时,通常 ...
- Java三大特征:封装 继承 多态
内部类:成员内部类.静态内部类.方法内部类.匿名内部类. 内部类:定义在另外一个类里面的类,与之对应,包含内部类的外部类被称为外部类. 内部类的作用:(1)内部类提供了更好的封装,可以把内部类隐藏在外 ...
- 什么情况下不能使用 Java 泛型
1. 前言 Java 1.5 引入了泛型来保证类型安全,防止在运行时发生类型转换异常,让类型参数化,提高了代码的可读性和重用率.但是有些情况下泛型也是不允许使用的,今天就总结一下编码中不能使用泛型的一 ...
- 深入理解JS中的对象(二):new 的工作原理
目录 序言 不同返回值的构造函数 深入 new 调用函数原理 总结 参考 1.序言 在 深入理解JS中的对象(一):原型.原型链和构造函数 中,我们分析了JS中是否一切皆对象以及对象的原型.原型链和构 ...
- [codeforces-543B]bfs求最短路
题意:给一个边长为1的无向图,求删去最多的边使得从a到b距离<=f,从c到d距离<=g,a,b,c,d,f,g都是给定的,求最多删去的边数. 思路:反过来思考,用最少的边构造两条从a到b, ...
- vue 在main.js里使用vue实例
可以用 Vue.prototype 比如 Vue.prototype.$indicator.close(); 关闭正在加载的动画
- MySQL安装(linux)
Centos 安装mysql 安装mariadb yum install mariadb mariadb-server mariadb-devel 安装mysql rpm -qa | grep MyS ...
- 网页爬虫--python3.6+selenium+BeautifulSoup实现动态网页的数据抓取,适用于对抓取频率不高的情况
说在前面: 本文主要介绍如何抓取 页面加载后需要通过JS加载的数据和图片 本文是通过python中的selenium(pyhton包) + chrome(谷歌浏览器) + chromedrive(谷歌 ...