Java集合框架(十二):SortedMap 源码分析 2022-02-20 14:26 342阅读 0赞 ### 文章目录 ### * * 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 映射和与输入有序映射相同的顺序。 ![在这里插入图片描述][20190413213359599.png] ## 2、SortedMap 类图 ## ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA2NDcwMzU_size_16_color_FFFFFF_t_70] **父接口:** 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; } @Override public 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() { //普通map Map<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() { //指定比较器的map Map<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号} [20190413213359599.png]: /images/20220220/093015e22bac412f847fb05e4f4af515.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA2NDcwMzU_size_16_color_FFFFFF_t_70]: /images/20220220/8866c15213b743a9a158ce5cdb6022c9.png
相关 Java集合框架(十九):LinkedHashMap 源码分析 文章目录 1、LinkedHashMap 简介 2、LinkedHashMap 数据结构 2.1、Entry 的继承体系 梦里梦外;/ 2021年10月18日 12:26/ 0 赞/ 247 阅读
相关 Java集合框架(二十一):HashTable 源码分析 文章目录 1、HashTable 简介 1.1、HashTable 定义 1.2、HashTable 属性 秒速五厘米/ 2021年10月19日 06:56/ 0 赞/ 219 阅读
相关 Java集合框架(十二):SortedMap 源码分析 文章目录 1、SortedMap 简述 2、SortedMap 类图 3、SortedMap 方法说明 4、Sort 拼搏现实的明天。/ 2022年02月20日 14:26/ 0 赞/ 343 阅读
相关 Java集合框架(十):Deque 源码分析 文章目录 1、Deque 简述 2、Deque 类图 3、Deque 方法概述 1、Deque 简述 线性集合,支持两端插 心已赠人/ 2022年02月23日 10:18/ 0 赞/ 189 阅读
相关 Java集合框架(十一):Map 源码分析 文章目录 1、Map 简述 2、Map 类图 3、Map 方法说明 1、Map 简述 java.util.Map 接口表示 水深无声/ 2022年04月23日 23:26/ 0 赞/ 188 阅读
相关 Java集合框架(十六):ArrayList 源码分析 文章目录 1、ArrayList 简述 2、ArrayList 类图 3、ArrayList 构造函数 3.1 向右看齐/ 2022年04月24日 03:04/ 0 赞/ 149 阅读
相关 Java集合框架(十七):LinkedList 源码分析 文章目录 1、LinkedList 简述 2、LinkedList 类图 2.1、LinkedList 内部结构 3 墨蓝/ 2022年04月24日 03:58/ 0 赞/ 175 阅读
相关 Java集合框架(十八):HashMap 源码分析 文章目录 1.HashMap简述 2.HashMap数据结构 2.1.JDK1.7中HashMap数据结构 素颜马尾好姑娘i/ 2022年05月26日 00:54/ 0 赞/ 110 阅读
相关 Java集合框架(十三):HashSet 源码分析 文章目录 1、简述 2、HashSet实现 3、常用方法 4、HashSet元素不重复原理 1、简述 Has 悠悠/ 2022年05月28日 12:25/ 0 赞/ 116 阅读
相关 Java集合框架(十五):TreeSet 源码分析 文章目录 1、TreeSet 简述 2、TreeSet源码分析 3、TreeSet排序方式 3.1、一是自然排 - 日理万妓/ 2022年05月28日 12:37/ 0 赞/ 125 阅读
还没有评论,来说两句吧...