Java集合框架(十二):SortedMap 源码分析
文章目录
- 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接口
所有通用的有序映射实现类都应该提供四个“标准”构造函数:
- 一个void(无参数)构造函数,它根据键的自然顺序创建一个空的有序映射。
- 具有Comparator类型的单个参数的构造函数,它创建根据指定的比较器排序的空的有序映射。
- 具有Map类型的单个参数的构造函数,它创建一个具有与其参数相同的 key-value 映射的新映射,并根据键的自然顺序进行排序。
- 具有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 源码分析相关推荐
- Java集合框架之接口Collection源码分析
本文我们主要学习Java集合框架的根接口Collection,通过本文我们可以进一步了解Collection的属性及提供的方法.在介绍Collection接口之前我们不得不先学习一下Iterable, ...
- Java集合框架之三:HashMap源码解析
Java集合框架之三:HashMap源码解析 版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! HashMap在我们的工作中应用的非常广泛,在工作面试中也经常会被问到,对于这样一个重要的集 ...
- 【集合框架】JDK1.8源码分析之HashMap(一)
转载自 [集合框架]JDK1.8源码分析之HashMap(一) 一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大 ...
- 【集合框架】JDK1.8源码分析之IdentityHashMap(四)
一.前言 前面已经分析了HashMap与LinkedHashMap,现在我们来分析不太常用的IdentityHashMap,从它的名字上也可以看出来用于表示唯一的HashMap,仔细分析了其源码,发现 ...
- 【集合框架】JDK1.8源码分析HashSet LinkedHashSet(八)
一.前言 分析完了List的两个主要类之后,我们来分析Set接口下的类,HashSet和LinkedHashSet,其实,在分析完HashMap与LinkedHashMap之后,再来分析HashSet ...
- 3.Java集合-HashSet实现原理及源码分析
一.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持,它不保证set的迭代顺序很久不变.此类允许使用null元素 二.HashSet的实现: 对于Ha ...
- Android Glide图片加载框架(二)源码解析之into()
文章目录 一.前言 二.源码解析 1.into(ImageView) 2.GlideContext.buildImageViewTarget() 3.RequestBuilder.into(Targe ...
- java 集合反射_关于granite源码包CollectionUtil集合工具类获取集合反射类型、实例化各种集合类型HashSet/ArrayList等...
一.前言 基于granite源码包org.granite.util.CollectionUtil集合工具类,分别获取集合反射类型java.lang.reflect.Type.实例化newCollect ...
- Android Glide图片加载框架(二)源码解析之load()
文章目录 一.前言 二.源码分析 1.load() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图片加载框架(二)源 ...
- Android Glide图片加载框架(二)源码解析之with()
文章目录 一.前言 二.如何阅读源码 三.源码解析 1.with() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图 ...
最新文章
- 2022-2028年中国机制砂石行业投资分析及前景预测报告
- 集五福,我用Python
- python 遍历字符串的每一个字符_Python之字符串的遍历的4种方式
- matlab-基础 size 获取矩阵的行数与列数
- Android应用资源---布局资源类型(Layout)
- DL之MobileNet:MobileNet算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- 关于跨DB增量(增、改)同步两张表的数据小技巧
- 136个Python 机器学习知识点让你受益终生!
- VTK:IO之3DSImporter
- oracle unused 语法_oracle--set unused
- 悲观锁和乐观锁_悲观锁和乐观锁处理并发操作
- java 合并流_Java Stream 流实现合并操作示例
- apache2.4打开laravel项目_Laravel异步队列全攻略
- bootstrap-面板
- 互联网公司如何有效执行流程的心得
- 配置防盗链 访问控制Directory 访问控制FilesMatch
- 注册表更改计算机语言为韩语,Windows10韩语语言包(Win10系统语言修改助手)V1.0 官方版...
- java字符串第一个字母表达_取一个字符串的第一个字母
- NOIP2017提高组广东省成绩
- 红帽子安装oracle,红帽子AS4安装oracle9i