【小家java】SortedMap和NavigableMap的使用介绍---TreeMap的源码简单分析(上)

简介: 【小家java】SortedMap和NavigableMap的使用介绍---TreeMap的源码简单分析(上)

参考阅读:

【小家java】HashMap原理、TreeMap、ConcurrentHashMap的原理、性能、安全方面大解析-----看这一篇就够了

SortedMap和NavigableMap


决定在讲解TreeMap的源码之前,先讲解这两个接口


SortedMap和SortedSet接口两个接口jdk1.2就已经提供,扩展的NavigableMap与NavigableSet接口jdk1.6才开始支持。


SortedMap:顾名思义,此接口应该与排序有关,以下是它的一些方法:


Comparator<? super K> comparator(); //可以自定义排序比较器
//按key升序排列,返回子映射,fromKey到toKey,包括fromKey,不包括toKey
SortedMap<K,V> subMap(K fromKey, K toKey);
//按key升序排列,返回子映射,开头到toKey,不包括toKey
SortedMap<K,V> headMap(K toKey);
//按key升序排列,返回子映射,fromKey到末尾,包括fromKey
SortedMap<K,V> tailMap(K fromKey);
//按key升序排列,返回第一个key
K firstKey();
//按key升序排列,返回最后一个key
K lastKey();
//返回key的集合,升序排列
Set<K> keySet();
//返回value的集合,按key升序排列,
Collection<V> values();
//返回Entry的集合,按key升序排列
Set<Map.Entry<K, V>> entrySet();


再看NavigableMap,它继承了SortedMap:

public interface NavigableMap<K,V> extends SortedMap<K,V>


它自己又定义了一些导航方法


//返回第一个key小于参数的Entry
Map.Entry<K,V> lowerEntry(K key);
//返回第一个key小于参数的key
K lowerKey(K key);
//返回第一个key小于等于参数的Entry
Map.Entry<K,V> floorEntry(K key);
//返回第一个key小于等于参数的key
K floorKey(K key);
//返回第一个key大于等于参数的Entry
Map.Entry<K,V> ceilingEntry(K key);
//返回第一个key大于等于参数的key
K ceilingKey(K key);
//返回第一个key大于参数的Entry
Map.Entry<K,V> higherEntry(K key);
//返回第一个key大于参数的key
K higherKey(K key);
//返回key最小的Entry
Map.Entry<K,V> firstEntry();
//返回key最大的Entry
Map.Entry<K,V> lastEntry();
//删除并返回key最小的Entry
Map.Entry<K,V> pollFirstEntry();
//删除并返回key最大的Entry
Map.Entry<K,V> pollLastEntry();
//返回key降序排列的NavigableMap(视图)  注意是视图,所以对它进行一个remove操作,也会影响到原来的Map的  是同一个引用
NavigableMap<K,V> descendingMap();
//返回key升序排列的NavigableSet
NavigableSet<K> navigableKeySet();
//返回key降序排列的NavigableSet
NavigableSet<K> descendingKeySet();
//返回key升序排列的子映射,设置包含标志
NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive);
//按key升序排列,返回子映射,开头到toKey,设置包含标志
NavigableMap<K,V> headMap(K toKey, boolean inclusive);
//按key升序排列,返回子映射,fromKey到末尾,设置包含标志
NavigableMap<K,V> tailMap(K fromKey, boolean inclusive);
//同时也继承了SortedMap的【不带包含标志】的子映射方法
SortedMap<K,V> subMap(K fromKey, K toKey);
SortedMap<K,V> headMap(K toKey);
SortedMap<K,V> tailMap(K fromKey);


NavigableMap所有已知实现类:ConcurrentSkipListMap(后面博文会有讲解), TreeMap


NavigableMap扩展了 SortedMap,具有了针对给定搜索目标返回最接近匹配项的导航方法。

方法 lowerEntry、floorEntry、ceilingEntry 和 higherEntry 分别返回与小于、小于等于、大于等于、大于给定键的键关联的 Map.Entry 对象,如果不存在这样的键,则返回 null。

类似地,方法 lowerKey、floorKey、ceilingKey 和 higherKey 只返回关联的键。所有这些方法是为查找条目而不是遍历条目而设计的。


descendingMap 方法返回映射的一个视图,该视图表示的所有关系方法和方向方法都是逆向的。升序操作和视图的性能很可能比降序操作和视图的性能要好。


此接口还定义了 firstEntry、pollFirstEntry、lastEntry 和 pollLastEntry 方法,它们返回和/或移除最小和最大的映射关系(如果存在),否则返回 null。


    public static void main(String[] args) {
        // NavigableMap多态接收TreeMap的实例
        NavigableMap<String, Integer> navigatorTreeMap = new TreeMap<String, Integer>() {{
            put("aa", 11);
            put("bb", 22);
            put("cc", 33);
            put("dd", 44);
            put("ee", 55);
            put("ff", 55);
            put("gg", 55);
        }};
        System.out.println(navigatorTreeMap.size());// 7个元素:7
        System.out.println(navigatorTreeMap.ceilingKey("cc"));// 返回大于等于cc的最小键:cc
        System.out.println(navigatorTreeMap.ceilingEntry("c"));//  返回一个键-值映射关系,它与大于等于cc的最小键关联:cc=33
        System.out.println(navigatorTreeMap.firstKey());// 最小键:aa
        System.out.println(navigatorTreeMap.firstEntry());// 最小键对应的k-v键值对:aa=11
        System.out.println(navigatorTreeMap.floorEntry("c"));// 返回一个键-值映射关系,它与小于等于给定键的最大键关联:bb=22
        System.out.println(navigatorTreeMap.floorKey("cc"));//   返回小于等于cc的最大键:cc
        System.out.println(navigatorTreeMap.headMap("bb"));// 返回此映射的部分视图,其键值严格小于bb:{aa=11}
        System.out.println(navigatorTreeMap.headMap("bb", true));// 同上小于等于(true):{aa=11, bb=22}
        System.out.println(navigatorTreeMap.higherEntry("c"));// 返回一个键-值映射关系,它与小于等于给定键的最大键关联:cc=33
        System.out.println(navigatorTreeMap.higherKey("cc"));//   返回小于等于cc的最大键:dd
        System.out.println(navigatorTreeMap.lastEntry());// 返回一个键-值映射关系,它与小于等于给定键的最大键关联:gg=55
        System.out.println(navigatorTreeMap.lastKey());//   返回小于等于cc的最大键:gg
        System.out.println(navigatorTreeMap.lowerEntry("c"));// 返回一个键-值映射关系,它与小于等于给定键的最大键关联:bb=22
        System.out.println(navigatorTreeMap.lowerKey("cc"));//    返回严格小于cc的最大键:bb
        System.out.println(navigatorTreeMap.pollFirstEntry());//  移除并返回与此映射中的最小键关联的键-值映射关系:aa=11
        System.out.println(navigatorTreeMap.pollLastEntry());//  移除并返回与此映射中的最大键关联的键-值映射关系:gg=55
        System.out.println(navigatorTreeMap.navigableKeySet());//   返回此映射中所包含键的
        // NavigableSet 视图。:[bb, cc, dd, ee, ff]
        System.out.println(navigatorTreeMap.subMap("aa", true, "dd", true));// 返回部分视图,true表示包括当前元素键值对:{bb=22, cc=33, dd=44}
        System.out.println(navigatorTreeMap.subMap("bb", "dd"));// 返回部分视图包括前面的元素,不包括后面的:{bb=22, cc=33}
        System.out.println(navigatorTreeMap.tailMap("cc"));// 返回元素大于cc的元素映射视图,包括cc://{cc=33, dd=44, ee=55, ff=55}
        System.out.println(navigatorTreeMap.tailMap("cc", false));// 返回元素大于等于cc的元素映射视图:{dd=44, ee=55, ff=55}
        //逆序视图
        NavigableMap<String, Integer> descendingMap = navigatorTreeMap.descendingMap();
        System.out.println(navigatorTreeMap); //原来的Map:
        System.out.println(descendingMap);// 返回逆序视图:{gg=55, ff=55, ee=55, dd=44, cc=33, bb=22, aa=11}
        //执行一个移除操作后  再看看会不会影响到原来的Map
        descendingMap.remove("gg");
        System.out.println(navigatorTreeMap); //原来的Map:{aa=11, bb=22, cc=33, dd=44, ee=55, ff=55}
        System.out.println(descendingMap);// 返回逆序视图:{ff=55, ee=55, dd=44, cc=33, bb=22, aa=11}
    }


之所以可以去到第一个最后一个元素,或者某个元素的前一个,后一个,是因为集合内部的元素是有序的。

相关文章
|
2天前
|
传感器 人工智能 前端开发
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
智慧校园电子班牌,坐落于班级的门口,适合于各类型学校的场景应用,班级学校日常内容更新可由班级自行管理,也可由学校统一管理。让我们一起看看,电子班牌有哪些功能呢?
41 4
JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式
|
2天前
|
分布式计算 Java API
Java8 Lambda实现源码解析
Java8的lambda应该大家都比较熟悉了,本文主要从源码层面探讨一下lambda的设计和实现。
|
3天前
|
存储 Java
0基础java初学者都能做的打字通小游戏? 内含源码解读和细致讲解!!
0基础java初学者都能做的打字通小游戏? 内含源码解读和细致讲解!!
15 2
0基础java初学者都能做的打字通小游戏? 内含源码解读和细致讲解!!
|
3天前
|
SQL Java 分布式数据库
实现HBase表和RDB表的转化(附Java源码资源)
该文介绍了如何将数据从RDB转换为HBase表,主要涉及三个来源:RDB Table、Client API和Files。文章重点讲解了RDB到HBase的转换,通过批处理思想,利用RDB接口批量导出数据并转化为`List&lt;Put&gt;`,然后导入HBase。目录结构包括配置文件、RDB接口及实现类、HBase接口及实现类,以及一个通用转换器接口和实现。代码中,`RDBImpl`负责从RDB读取数据并构造`Put`对象,`HBaseImpl`则负责将`Put`写入HBase表。整个过程通过配置文件`transfer.properties`管理HBase和RDB的映射关系。
21 3
实现HBase表和RDB表的转化(附Java源码资源)
|
6天前
|
消息中间件 缓存 Java
java基于云部署的SaaS医院云HIS系统源码 心理CT、B超 lis、电子病历
云HIS系统是一款满足基层医院各类业务需要的健康云产品。该产品能帮助基层医院完成日常各类业务,提供病患预约挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生工作站和护士工作站等一系列常规功能,还能与公卫、PACS等各类外部系统融合,实现多层机构之间的融合管理。
41 12
|
9天前
|
人工智能 监控 Java
java互联网+智慧工地云平台SaaS源码
智慧工地以施工现场风险预知和联动预控为目标,将智能AI、传感技术、人像识别、监控、虚拟现实、物联网、5G、大数据、互联网等新一代科技信息技术植入到建筑、机械、人员穿戴设施、场地进出关口等各类设备中,实现工程管理与工程施工现场的整合
22 0
|
10天前
|
Java
JAVA循环结构分析与设计
JAVA循环结构分析与设计
16 1
|
11天前
|
监控 Java BI
java基于云计算的SaaS医院his信息系统源码 HIS云平台源码
基于云计算技术的B/S架构的HIS系统源码,SaaS模式Java版云HIS系统,融合B/S版电子病历系统,支持电子病历四级,HIS与电子病历系统均拥有自主知识产权。
40 5
|
12天前
|
网络协议 物联网 Java
Go与Java:在物联网领域的适用性分析
本文对比分析了Go和Java在物联网领域的适用性。Go语言因其轻量级、高效和并发特性,适合资源受限的物联网设备,特别是处理并发连接和数据流。Java则凭借跨平台性、丰富的生态系统和企业级应用能力,适用于大型物联网系统和复杂业务场景。两者在物联网领域各有优势,开发者可根据项目需求选择合适的语言。
|
12天前
|
人工智能 监控 数据可视化
Java智慧工地云平台源码带APP SaaS模式 支持私有化部署和云部署
智慧工地是指应用智能技术和互联网手段对施工现场进行管理和监控的一种工地管理模式。它利用传感器、监控摄像头、人工智能、大数据等技术,实现对施工现场的实时监测、数据分析和智能决策,以提高工地的安全性、效率和质量(技术架构:微服务+Java+Spring Cloud +UniApp +MySql)。
32 4