0

0

Java中的TreeMap怎么实现按Key排序_自定义Comparator比较器实战

P粉602998670

P粉602998670

发布时间:2026-03-16 15:50:31

|

294人浏览过

|

来源于php中文网

原创

TreeMap 构造时必须传入 Comparator 才能自定义排序,之后无法更改;String Key 倒序用 Comparator.reverseOrder();自定义 Key 需处理 null 安全与不可变性,否则导致查找失败或结构损坏。

java中的treemap怎么实现按key排序_自定义comparator比较器实战

TreeMap 默认就按 Key 排序,不需要你手动排序;但想改排序规则,必须在构造时传入 Comparator,之后无法动态更换。

TreeMap 构造时传 Comparator 是唯一生效时机

很多人试图先 new 一个空 TreeMap,再调用某个方法“设置”比较器——没这回事。TreeMap 的比较逻辑在构造完成那一刻就锁死了,后续所有 putgetkeySet() 都依赖它。

  • ✅ 正确:用 new TreeMap(Comparator.comparing(...)) 或自定义 Comparator 实现类
  • ❌ 错误:TreeMap map = new TreeMap(); map.setComparator(...)(根本不存在这个方法)
  • ⚠️ 注意:TreeMap(Map) 构造函数不会继承原 Map 的顺序逻辑,它会用自然顺序(或默认 Comparator),除非你显式传入带比较器的构造器

String 类型 Key 用 Comparator.reverseOrder() 就够了

如果 Key 是 String,又想倒序排列,别手写 compare 方法——JDK 8+ 提供了现成的静态工厂方法,简洁且无装箱开销。

  • 正序(默认):new TreeMap()new TreeMap(Comparator.naturalOrder())
  • 倒序:new TreeMap(Comparator.reverseOrder())
  • 忽略大小写倒序:new TreeMap(String.CASE_INSENSITIVE_ORDER.reversed())
  • ⚠️ 别写 new TreeMap((a, b) -> b.compareTo(a)) —— 多余,还容易空指针(没判 null)

自定义对象作 Key 必须处理 null 安全和 equals 一致性

用自定义类当 Key 时,Comparator 的行为必须和 equals()hashCode() 逻辑不冲突,否则 containsKey() 可能返回 false,即使 key 看起来“相等”。

Seed-Music
Seed-Music

字节跳动推出的AI音乐生成与编辑工具

下载

立即学习Java免费学习笔记(深入)”;

  • ❌ 危险写法:Comparator.comparing(User::getName),但 User.name 可能为 null → 抛 NullPointerException
  • ✅ 安全写法:Comparator.comparing(User::getName, Comparator.nullsLast(String::compareTo))
  • ⚠️ 更关键的是:如果两个 User 对象 name 相同但 id 不同,它们在 TreeMap 中是否算同一个 key?取决于你的 Comparator 是否把 id 作为次级排序字段。如果不加,put 可能覆盖掉旧值,而你以为是新增
  • 性能提示:避免在 compare() 里做 IO、数据库查询或复杂计算——每次 put / get 都会调用它,树高 O(log n),但常数项会被放大

TreeMap 的 keySet() / entrySet() 返回的是“实时视图”,不是快照

有人以为遍历 keySet() 时删元素没问题,其实和 HashMap 一样,直接删会触发 ConcurrentModificationException,除非用迭代器的 remove() 方法。

  • ✅ 安全删除:Iterator<map.entry integer>> it = map.entrySet().iterator(); while (it.hasNext()) { if (someCondition) it.remove(); }</map.entry>
  • ❌ 危险操作:for (String k : map.keySet()) { if (k.startsWith("tmp")) map.remove(k); } → 运行时报错
  • ⚠️ 特别注意:如果你的 Comparator 依赖对象内部可变状态(比如某字段 later 被修改),那么该对象插入后又被修改,TreeMap 的结构可能损坏——get() 找不到、size() 异常、甚至死循环。Key 对象应当尽量不可变(immutable)

最常被忽略的其实是 Key 的可变性问题:Comparator 没写错、null 处理也到位,但某个 User 对象插入后改了 name,整个 TreeMap 就“失序”了——它不会自动重排,后续操作结果不可预测。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1071

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1132

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

107

2023.09.25

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

23

2025.11.16

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

77

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

41

2025.11.16

minimax入口地址汇总
minimax入口地址汇总

本专题整合了minimax相关入口合集,阅读专题下面的文章了解更多详细地址。

3

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.5万人学习

C# 教程
C# 教程

共94课时 | 11.5万人学习

Java 教程
Java 教程

共578课时 | 83.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号