Java集合——7.使用TreeMap
有序映射的实现:TreeMap的特性与使用
在Java集合框架中,HashMap的Key是无序的,遍历顺序不可预测。如果需要对Key进行排序,可以选择TreeMap—它实现了SortedMap接口,能在内部对Key进行自动排序,让遍历操作按照Key的顺序进行。
TreeMap的体系结构
TreeMap与HashMap同属Map接口的实现,但二者的设计目标不同。从继承关系来看:
┌───┐
│Map│
└───┘
▲
┌────┴─────┐
│ │
┌───────┐ ┌─────────┐
│HashMap│ │SortedMap│
└───────┘ └─────────┘
▲
│
┌─────────┐
│ TreeMap │
└─────────┘
HashMap追求查找效率,Key无序SortedMap是有序映射接口,TreeMap是其主要实现类,保证Key的有序性
TreeMap的使用
当Key是String、Integer等已实现Comparable接口的类型时,TreeMap会默认按自然顺序排序:
import java.util.*;
public class TreeMapBasic {
public static void main(String[] args) {
Map<String, Integer> fruitMap = new TreeMap<>();
fruitMap.put("orange", 5);
fruitMap.put("apple", 3);
fruitMap.put("banana", 2);
// 遍历Key时会按字母顺序输出
for (String key : fruitMap.keySet()) {
System.out.println(key + ": " + fruitMap.get(key));
}
// 输出顺序:apple, banana, orange
}
}
自定义排序规则
如果Key的类型未实现Comparable接口,或需要自定义排序逻辑,可在创建TreeMap时传入Comparator对象:
import java.util.*;
public class TreeMapCustomSort {
public static void main(String[] args) {
// 按Person的name字段升序排序
Map<Person, Integer> personMap = new TreeMap<>(new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
return p1.name.compareTo(p2.name);
}
});
personMap.put(new Person("Alice"), 25);
personMap.put(new Person("Bob"), 30);
personMap.put(new Person("Charlie"), 28);
for (Person key : personMap.keySet()) {
System.out.println(key + " -> " + personMap.get(key));
}
// 输出顺序:Alice, Bob, Charlie
}
static class Person {
String name;
Person(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" + name + "}";
}
}
}
注意事项:比较逻辑的正确性
TreeMap的正常工作依赖于正确的比较逻辑实现。Comparator.compare()方法必须严格遵循:
- 若
a < b,返回负数(通常为-1) - 若
a == b,返回0 - 若
a > b,返回正数(通常为1)
错误示例:
// 错误的比较器:分数相等时未返回0
Comparator<Student> wrongComparator = (s1, s2) ->
s1.score > s2.score ? -1 : 1;
正确示例:
// 正确的比较器:处理相等情况
Comparator<Student> correctComparator = (s1, s2) -> {
if (s1.score == s2.score) {
return 0; // 分数相等时必须返回0
}
return s1.score > s2.score ? -1 : 1;
};
注意:
TreeMap判断Key是否相等完全依赖比较逻辑的返回值,不使用equals()和hashCode()方法。
总结
- 掌握
TreeMap的特性和适用场景 - 掌握
TreeMap的实现:- Key需实现
Comparable接口或通过Comparator指定排序规则 - 比较逻辑必须严格实现相等(返回0)、大于(返回正数)和小于(返回负数)的判断
- Key需实现
Java集合——7.使用TreeMap的更多相关文章
- Java 集合系列 12 TreeMap
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Java集合框架之TreeMap浅析
Java集合框架之TreeMap浅析 一.TreeMap综述: TreeMap在Map中的结构如下:
- Java集合系列之TreeMap源代码分析
一.概述 TreeMap是基于红黑树实现的.因为TreeMap实现了java.util.sortMap接口,集合中的映射关系是具有一定顺序的,该映射依据其键的自然顺序进行排序或者依据创建映射时提供的C ...
- Java 集合系列 09 HashMap详细介绍(源码解析)和使用示例
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Java 集合系列 10 Hashtable详细介绍(源码解析)和使用示例
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Java 集合系列 17 TreeSet
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Java 集合系列 16 HashSet
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Java 集合系列 15 Map总结
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Java 集合系列 14 hashCode
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Java 集合系列 13 WeakHashMap
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
随机推荐
- Jenkins自动化部署-----持续交付
前言: 感谢之前带领过我的leader,让我能够知道什么是好的开发方法. 在很早之前就接触过敏捷开发.什么是敏捷开发,简单来说就是让软件可靠地,快速地发布出来的一种开发方法和技巧. 而敏捷开发中有许多 ...
- java RSA公私钥生成工具类
package cn.daenx.my.util; import java.security.*; import java.security.spec.PKCS8EncodedKeySpec; imp ...
- java springboot api接口导出xlsx(不使用easyexcle)
说明 在上一个文章里说了,用了阿里巴巴的easyexcle会导致项目build后的jar包体积增大20MB左右,所以想了个曲线救国的方式 其中的\t是制表符,即tab键,\n是回车 你可以自己试着这样 ...
- 乒乓球测距(K210)
测距 说明 识别的物体是乒乓球(规格应该是统一的吧), 硬件是K210,测距的函数经过拟合,在50cm范围内是准确的 如果使用起来不准确,可以打印代码中的LM, 然后去测数据,自己再拟合一个函数,代替 ...
- DeepSeekMath -- GRPO
Deepseek系列博客目录 Model 核心 Date DeepSeekLLM 探究LLM Scalling Law 2024.01 DeepSeekMath 提出GRPO 2024.04 Deep ...
- 你应该懂的AI大模型(四)之 LangChain
这篇文章里面会有一些 python 代码,能看懂就行,可能会有语法错误大家当伪代码看吧, AI 应用开发也不会去敲这些代码(甚至整个过程都不太需要敲代码),文章中的这些代码只是为了更好的理解这些组件, ...
- Vue <img :src=""/> 图片不显示
场景 图片路径被原样输出,无法正确加载图片: <img :src="imgSrc"/> 原因 webpack 会将:src 动态绑定的值解析成字符串,原样输出: 解决办 ...
- Blazor学习之旅 (13) Razor类库的使用
在上一篇我们学习了Blazor和JavaScript的互操作性,这一篇我们了解下如何创建和使用Razor类库. 什么是Razor类库? 我们都知道,在.NET应用程序中,我们可以通过NuGet来安装各 ...
- 基于混合检索与RRF融合的智能问答系统核心技术解析
引言 在当今信息爆炸的时代,如何快速.精准地从海量知识中定位用户所需信息,成为智能问答系统面临的核心挑战.GC-QA-RAG系统通过创新的向量检索技术和混合检索机制,实现了高效的知识点定位能力.本文将 ...
- json\jquery入门
一)什么是JSON (1)JSON(Java Script Object Notation(记号,标记))是一种轻量级的数据交换语言, 以文本字符串为基础,且易于让人阅读 注意:XML就是一个重量级的 ...