java treemap 实现_Java中的集合(十一) 实现Map接口的TreeMap

本文详细介绍了Java中的TreeMap,它是一个基于红黑树数据结构的有序Map。TreeMap的插入、删除、查找操作的时间复杂度为O(log(n))。文章讨论了TreeMap与Map的关系、其继承结构、有序实现方式、构造方法、重要成员属性、遍历方法以及与HashMap和TreeSet的异同。
摘要由CSDN通过智能技术生成

Java中的集合(十一) 实现Map接口的TreeMap

一、TreeMap简介(基于JDK1.8)

TreeMap是基于红黑树数据结构,是一个key-value的有序集合,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。因为红黑树是平衡的二叉搜索树,所以其put、get、remove的时间复杂度都为log(n)。

(一)、TreeMap与Map的关系

3f0bf2784639426b62d837106c15b4fe.png

(二)、数据结构

红黑树操作包括插入、删除、左旋、右旋,这里有个可视化的红黑树操作网站,把这些操作都按动画做出来了,生动形象。

5d176ff76238f732a12750994547ee4f.png

二、TreeMap的继承结构

(一)、继承结构

9504b867a81e408702a017d1e2112b5d.png

8feb04cc460413d455c5ad436a47af11.png

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的基础上增加了一些导航方法来返回与搜索目标最近的元素。例如下面这些方法:

f097833514a38c36802f237c8f3b8374.png

三、TreeMap的构造方法

11125f84e147f48e5463913f9e0d50fa.png

四、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集合

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 //假设treeMap中的key是String类型,value是Integer类型

2 Set> set =treeMap.entrySet();3 //迭代器遍历

4 Iterator> it =set.iterator();5 while(it.hasNext()) {6 Map.Entry entry =it.next();7 String str =entry.getKey();8 Integer i =entry.getValue();9 }10

11 //for-each循环遍历

12 for (Map.Entryentry : set) {13 String str =entry.getKey();14 Integer i =entry.getValue();15 }

View Code

(二)、通过keySet(),键的遍历

①、首先通过keySet方法获取键的Set集合;

②、通过迭代器或者for-each循环遍历获得的Set集合

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 Set set =treeMap.keySet();2 Iterator it =set.iterator();3 while(it.hasNext()) {4 String str =it.next();5 }

View Code

(三)、通过value(),值的遍历

①、首先通过entrySet方法获取值的Set集合;

②、通过迭代器或者for-each循环遍历获得的Set集合

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 Collection con =treeMap.values();2 Iterator it =con.iterator();3 while(it.hasNext()) {4 Integer i =it.next();5 }

View Code

六、TreeMap常用API

0224830b43ec1284a4f14d974797d65b.png

c1380566994f2b13c90a4fe0e608e16d.png

七、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对象有序,双列集合)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值