有序映射的实现:TreeMap的特性与使用

在Java集合框架中,HashMap的Key是无序的,遍历顺序不可预测。如果需要对Key进行排序,可以选择TreeMap—它实现了SortedMap接口,能在内部对Key进行自动排序,让遍历操作按照Key的顺序进行。

TreeMap的体系结构

TreeMapHashMap同属Map接口的实现,但二者的设计目标不同。从继承关系来看:

       ┌───┐
│Map│
└───┘

┌────┴─────┐
│ │
┌───────┐ ┌─────────┐
│HashMap│ │SortedMap│
└───────┘ └─────────┘


┌─────────┐
│ TreeMap │
└─────────┘
  • HashMap追求查找效率,Key无序
  • SortedMap是有序映射接口,TreeMap是其主要实现类,保证Key的有序性

TreeMap的使用

当Key是StringInteger等已实现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)、大于(返回正数)和小于(返回负数)的判断

Java集合——7.使用TreeMap的更多相关文章

  1. Java 集合系列 12 TreeMap

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  2. Java集合框架之TreeMap浅析

    Java集合框架之TreeMap浅析 一.TreeMap综述: TreeMap在Map中的结构如下:

  3. Java集合系列之TreeMap源代码分析

    一.概述 TreeMap是基于红黑树实现的.因为TreeMap实现了java.util.sortMap接口,集合中的映射关系是具有一定顺序的,该映射依据其键的自然顺序进行排序或者依据创建映射时提供的C ...

  4. Java 集合系列 09 HashMap详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  5. Java 集合系列 10 Hashtable详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  6. Java 集合系列 17 TreeSet

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  7. Java 集合系列 16 HashSet

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  8. Java 集合系列 15 Map总结

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  9. Java 集合系列 14 hashCode

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  10. Java 集合系列 13 WeakHashMap

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

随机推荐

  1. Jenkins自动化部署-----持续交付

    前言: 感谢之前带领过我的leader,让我能够知道什么是好的开发方法. 在很早之前就接触过敏捷开发.什么是敏捷开发,简单来说就是让软件可靠地,快速地发布出来的一种开发方法和技巧. 而敏捷开发中有许多 ...

  2. java RSA公私钥生成工具类

    package cn.daenx.my.util; import java.security.*; import java.security.spec.PKCS8EncodedKeySpec; imp ...

  3. java springboot api接口导出xlsx(不使用easyexcle)

    说明 在上一个文章里说了,用了阿里巴巴的easyexcle会导致项目build后的jar包体积增大20MB左右,所以想了个曲线救国的方式 其中的\t是制表符,即tab键,\n是回车 你可以自己试着这样 ...

  4. 乒乓球测距(K210)

    测距 说明 识别的物体是乒乓球(规格应该是统一的吧), 硬件是K210,测距的函数经过拟合,在50cm范围内是准确的 如果使用起来不准确,可以打印代码中的LM, 然后去测数据,自己再拟合一个函数,代替 ...

  5. DeepSeekMath -- GRPO

    Deepseek系列博客目录 Model 核心 Date DeepSeekLLM 探究LLM Scalling Law 2024.01 DeepSeekMath 提出GRPO 2024.04 Deep ...

  6. 你应该懂的AI大模型(四)之 LangChain

    这篇文章里面会有一些 python 代码,能看懂就行,可能会有语法错误大家当伪代码看吧, AI 应用开发也不会去敲这些代码(甚至整个过程都不太需要敲代码),文章中的这些代码只是为了更好的理解这些组件, ...

  7. Vue <img :src=""/> 图片不显示

    场景 图片路径被原样输出,无法正确加载图片: <img :src="imgSrc"/> 原因 webpack 会将:src 动态绑定的值解析成字符串,原样输出: 解决办 ...

  8. Blazor学习之旅 (13) Razor类库的使用

    在上一篇我们学习了Blazor和JavaScript的互操作性,这一篇我们了解下如何创建和使用Razor类库. 什么是Razor类库? 我们都知道,在.NET应用程序中,我们可以通过NuGet来安装各 ...

  9. 基于混合检索与RRF融合的智能问答系统核心技术解析

    引言 在当今信息爆炸的时代,如何快速.精准地从海量知识中定位用户所需信息,成为智能问答系统面临的核心挑战.GC-QA-RAG系统通过创新的向量检索技术和混合检索机制,实现了高效的知识点定位能力.本文将 ...

  10. json\jquery入门

    一)什么是JSON (1)JSON(Java Script Object Notation(记号,标记))是一种轻量级的数据交换语言, 以文本字符串为基础,且易于让人阅读 注意:XML就是一个重量级的 ...