文章目录

  • 1、SortedMap 简述
  • 2、SortedMap 类图
  • 3、SortedMap 方法说明
  • 4、SortedMap 应用示例
    • 4.1、SortedMap 构造函数示例
      • 4.1.1、无参构造函数
      • 4.1.2、具有 Comparator 的构造函数
      • 4.1.3、参数为 Map 类型的构造函数
      • 4.1.4、参数为 SortedMap 类型的构造函数
    • 4.2、SortedMap 方法示例

1、SortedMap 简述

SortedMap 接口扩展了 Map 接口并提供了有序的Map实现,SortedMap 的排序方式有两种:根据键值的自然顺序排序和指定比较器(Comparator)排序。插入有序的 SortedMap 的所有元素都必须实现Comparable接口

所有通用的有序映射实现类都应该提供四个“标准”构造函数:

  1. 一个void(无参数)构造函数,它根据键的自然顺序创建一个空的有序映射。
  2. 具有Comparator类型的单个参数的构造函数,它创建根据指定的比较器排序的空的有序映射。
  3. 具有Map类型的单个参数的构造函数,它创建一个具有与其参数相同的 key-value 映射的新映射,并根据键的自然顺序进行排序。
  4. 具有SortedMap类型的单个参数的构造函数,它创建一个新的有序映射,其具有相同的 key-value 映射和与输入有序映射相同的顺序。

2、SortedMap 类图

父接口:

Map<K,V>

所有已知子接口:

ConcurrentNavigableMap<K,V>, NavigableMap<K,V>

所有已知实现类:

ConcurrentSkipListMap, TreeMap

3、SortedMap 方法说明

1、Comparator<? super K> comparator():
返回用于对此映射中的键进行排序的比较器;如果此映射使用其键的自然顺序,则返回null。

2、SortedMap<K,V> subMap(K fromKey, K toKey):

返回此映射部分的视图,其键的范围从fromKey(包括)到 toKey(不包括)。 (如果fromKey和 toKey 相等,则返回的视图为空。)

当尝试在返回的映射范围之外插入键时,将会抛出 IllegalArgumentException。

3、SortedMap<K,V> headMap(K toKey):

返回此映射的部分视图,其键的范围小于 toKey。

4、SortedMap<K,V> tailMap(K fromKey):

返回此映射的部分视图,其键的范围大于等于fromKey。

5、K firstKey():

返回此映射中当前的第一个键。

6、K lastKey():

返回此映射中当前的最后一个键。

7、Set keySet():

返回此映射中所有键的 Set 视图。 set的迭代器按升序返回键。

如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未知的。 该集合支持元素删除,它支持通过 Iterator.remove,Set.remove,removeAll,retainAll 和 clear 操作从视图中删除相应的映射。 它不支持add或addAll操作。

8、Collection values():

返回此映射中包含的值的Collection视图。 集合的迭代器以相应键的升序返回值。

如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未知的。 该集合支持元素删除,它支持通过 Iterator.remove,Set.remove,removeAll,retainAll 和 clear 操作从视图中删除相应的映射。 它不支持add或addAll操作。

9、Set<Map.Entry<K,V>> entrySet():

返回此映射中包含的映射的Set<Map.Entry<K,V>>视图。 set的迭代器以升序键顺序返回条目。

如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未知的。 该集合支持元素删除,它支持通过 Iterator.remove,Set.remove,removeAll,retainAll 和 clear 操作从视图中删除相应的映射。 它不支持add或addAll操作。

4、SortedMap 应用示例

以下示例需要使用的对象如下

public class PersonDetail {String name;LocalDate birthday;String address;public PersonDetail(String name, LocalDate birthday, String address) {this.name = name;this.birthday = birthday;this.address = address;}@Overridepublic String toString() {return this.name + ", from " + this.address;}
}

4.1、SortedMap 构造函数示例

4.1.1、无参构造函数

按照key的自然顺序排序

private static void method1() {//key的自然顺序排序SortedMap<String, PersonDetail> personMap = new TreeMap<>();personMap.put("zhangsan", new PersonDetail("张三", LocalDate.of(1998, 6, 22), "小胡同3号"));personMap.put("lisi", new PersonDetail("李四", LocalDate.of(1996, 2, 2), "小胡同8号"));personMap.put("wanger", new PersonDetail("王二", LocalDate.of(2010, 12, 11), "小胡同28号"));personMap.forEach((key, value) -> System.out.println(key + " -> " + value));}

输出结果:

lisi -> 李四, from 小胡同8号
wanger -> 王二, from 小胡同28号
zhangsan -> 张三, from 小胡同3号

4.1.2、具有 Comparator 的构造函数

我们编写一个lambda表达式来提供Comparator接口的compareTo实现。 假设我们希望按照key长度按降序对key进行排序

private static void method1() {//key的长度排序SortedMap<String, PersonDetail> personMap = new TreeMap<>((s1, s2) -> s2.length() - s1.length());personMap.put("zhangsan", new PersonDetail("张三", LocalDate.of(1998, 6, 22), "小胡同3号"));personMap.put("lisi", new PersonDetail("李四", LocalDate.of(1996, 2, 2), "小胡同8号"));personMap.put("wanger", new PersonDetail("王二", LocalDate.of(2010, 12, 11), "小胡同28号"));personMap.forEach((key, value) -> System.out.println(key + " -> " + value));}

输出结果:

zhangsan -> 张三, from 小胡同3号
wanger -> 王二, from 小胡同28号
lisi -> 李四, from 小胡同8号

4.1.3、参数为 Map 类型的构造函数

 private static void method2() {//普通mapMap<String, PersonDetail> generalMap = new HashMap<>();generalMap.put("lilei", new PersonDetail("李雷", LocalDate.of(1994, 6, 22), "1号大街"));generalMap.put("hanmeimei", new PersonDetail("韩梅梅", LocalDate.of(1995, 2, 2), "2号大街"));generalMap.put("zhangmeili", new PersonDetail("张美丽", LocalDate.of(2010, 12, 11), "3号大街"));//普通map作为SortedMap构造函数的参数SortedMap<String, PersonDetail> sortedMap = new TreeMap<>(generalMap);System.err.println("普通map作为SortedMap构造函数的参数:");sortedMap.forEach((key, value) -> System.out.println(key + " -> " + value));
}

输出结果:

普通map作为SortedMap构造函数的参数:
hanmeimei -> 韩梅梅, from 2号大街
lilei -> 李雷, from 1号大街
zhangmeili -> 张美丽, from 3号大街

4.1.4、参数为 SortedMap 类型的构造函数

private static void method2() {//指定比较器的mapMap<String, PersonDetail> sortedComparetorMap = new TreeMap<>((s1, s2) -> s2.length() - s1.length());sortedComparetorMap.put("lilei", new PersonDetail("李雷", LocalDate.of(1994, 6, 22), "1号大街"));sortedComparetorMap.put("hanmeimei", new PersonDetail("韩梅梅", LocalDate.of(1995, 2, 2), "2号大街"));sortedComparetorMap.put("zhangmeili", new PersonDetail("张美丽", LocalDate.of(2010, 12, 11), "3号大街"));System.err.println("指定比较器的有序map作为SortedMap构造函数的参数:");SortedMap<String, PersonDetail> newMap = new TreeMap<>(sortedComparetorMap);newMap.forEach((key, value) -> System.out.println(key + " -> " + value));}

输出结果:

指定比较器的有序map作为SortedMap构造函数的参数:
hanmeimei -> 韩梅梅, from 2号大街
lilei -> 李雷, from 1号大街
zhangmeili -> 张美丽, from 3号大街

4.2、SortedMap 方法示例

private static void method3() {SortedMap<String, PersonDetail> personMap = new TreeMap<>((s1, s2) -> s2.length() - s1.length());personMap.put("zhangsan", new PersonDetail("张三", LocalDate.of(1998, 6, 22), "小胡同3号"));personMap.put("lisi", new PersonDetail("李四", LocalDate.of(1996, 2, 2), "小胡同8号"));personMap.put("wanger", new PersonDetail("王二", LocalDate.of(2010, 12, 11), "小胡同28号"));System.out.println("映射关系如下:===================");personMap.forEach((key, value) -> System.out.println(key + " -> " + value));System.out.println("===================");System.out.println("entrySet:" + personMap.entrySet());System.out.println("firstKey:" + personMap.firstKey());System.out.println("lastKey:" + personMap.lastKey());System.out.println("keySet:" + personMap.keySet());System.out.println("values:" + personMap.values());System.out.println("headMap:" + personMap.headMap("wanger"));System.out.println("tailMap:" + personMap.tailMap("wanger"));}

输出结果:

映射关系如下:===================
zhangsan -> 张三, from 小胡同3号
wanger -> 王二, from 小胡同28号
lisi -> 李四, from 小胡同8号
===================
entrySet:[zhangsan=张三, from 小胡同3号, wanger=王二, from 小胡同28号, lisi=李四, from 小胡同8号]
firstKey:zhangsan
lastKey:lisi
keySet:[zhangsan, wanger, lisi]
values:[张三, from 小胡同3号, 王二, from 小胡同28号, 李四, from 小胡同8号]
headMap("wanger"):{zhangsan=张三, from 小胡同3号}
tailMap("wanger"):{wanger=王二, from 小胡同28号, lisi=李四, from 小胡同8号}

Java集合框架(十二):SortedMap 源码分析相关推荐

  1. Java集合框架之接口Collection源码分析

    本文我们主要学习Java集合框架的根接口Collection,通过本文我们可以进一步了解Collection的属性及提供的方法.在介绍Collection接口之前我们不得不先学习一下Iterable, ...

  2. Java集合框架之三:HashMap源码解析

    Java集合框架之三:HashMap源码解析 版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! HashMap在我们的工作中应用的非常广泛,在工作面试中也经常会被问到,对于这样一个重要的集 ...

  3. 【集合框架】JDK1.8源码分析之HashMap(一)

    转载自  [集合框架]JDK1.8源码分析之HashMap(一) 一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大 ...

  4. 【集合框架】JDK1.8源码分析之IdentityHashMap(四)

    一.前言 前面已经分析了HashMap与LinkedHashMap,现在我们来分析不太常用的IdentityHashMap,从它的名字上也可以看出来用于表示唯一的HashMap,仔细分析了其源码,发现 ...

  5. 【集合框架】JDK1.8源码分析HashSet LinkedHashSet(八)

    一.前言 分析完了List的两个主要类之后,我们来分析Set接口下的类,HashSet和LinkedHashSet,其实,在分析完HashMap与LinkedHashMap之后,再来分析HashSet ...

  6. 3.Java集合-HashSet实现原理及源码分析

    一.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持,它不保证set的迭代顺序很久不变.此类允许使用null元素 二.HashSet的实现: 对于Ha ...

  7. Android Glide图片加载框架(二)源码解析之into()

    文章目录 一.前言 二.源码解析 1.into(ImageView) 2.GlideContext.buildImageViewTarget() 3.RequestBuilder.into(Targe ...

  8. java 集合反射_关于granite源码包CollectionUtil集合工具类获取集合反射类型、实例化各种集合类型HashSet/ArrayList等...

    一.前言 基于granite源码包org.granite.util.CollectionUtil集合工具类,分别获取集合反射类型java.lang.reflect.Type.实例化newCollect ...

  9. Android Glide图片加载框架(二)源码解析之load()

    文章目录 一.前言 二.源码分析 1.load() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图片加载框架(二)源 ...

  10. Android Glide图片加载框架(二)源码解析之with()

    文章目录 一.前言 二.如何阅读源码 三.源码解析 1.with() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图 ...

最新文章

  1. 2022-2028年中国机制砂石行业投资分析及前景预测报告
  2. 集五福,我用Python
  3. python 遍历字符串的每一个字符_Python之字符串的遍历的4种方式
  4. matlab-基础 size 获取矩阵的行数与列数
  5. Android应用资源---布局资源类型(Layout)
  6. DL之MobileNet:MobileNet算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  7. 关于跨DB增量(增、改)同步两张表的数据小技巧
  8. 136个Python 机器学习知识点让你受益终生!
  9. VTK:IO之3DSImporter
  10. oracle unused 语法_oracle--set unused
  11. 悲观锁和乐观锁_悲观锁和乐观锁处理并发操作
  12. java 合并流_Java Stream 流实现合并操作示例
  13. apache2.4打开laravel项目_Laravel异步队列全攻略
  14. bootstrap-面板
  15. 互联网公司如何有效执行流程的心得
  16. 配置防盗链 访问控制Directory 访问控制FilesMatch
  17. 注册表更改计算机语言为韩语,Windows10韩语语言包(Win10系统语言修改助手)V1.0 官方版...
  18. java字符串第一个字母表达_取一个字符串的第一个字母
  19. NOIP2017提高组广东省成绩
  20. 红帽子安装oracle,红帽子AS4安装oracle9i

热门文章

  1. Copilot 简单测评
  2. 骨科专家:它比跑步更毁膝盖!危害极大,您却天天在做...
  3. 创业故事:公司的形象和口碑建设
  4. 【数据库数据恢复】SQL SERVER数据库MDF (NDF)或LDF损坏怎么恢复数据?
  5. Gradle下载安装
  6. 退役军人信息化服务平台订花开发服务流程
  7. Pycharm安装OpenCV
  8. PCB如何拼版?PCB有哪些拼版规则?
  9. 铲屎官拍了拍狗鼻子,你家狗子也能刷脸啦
  10. cts游戏手机版_cts游戏手机版下载-cts游戏手机版下载中文版v1.6-完全实况