0

0

如何使用Java的NavigableMap进行有序检索_高级映射操作指南

P粉602998670

P粉602998670

发布时间:2026-03-06 12:58:03

|

184人浏览过

|

来源于php中文网

原创

navigablemap 不是 treemap 的“高级马甲”,其核心价值在于提供 ceilingkey()、floorentry() 等方向性导航方法,而非仅排序;必须用 treemap 或 concurrentskiplistmap 实例化,且需实际调用导航操作才体现优势。

如何使用java的navigablemap进行有序检索_高级映射操作指南

为什么 NavigableMap 不是 TreeMap 的“高级马甲”

它确实是 TreeMap 的主要实现接口,但关键区别在于:接口定义了**方向性检索能力**,而不仅仅是“已排序”。如果你只用 get()keySet(),那和普通 Map 没差——真正价值在 ceilingKey()floorEntry() 这类带语义的导航方法上。

常见错误是把 NavigableMap 当成“更酷的 Map”去泛型声明,却没调用任何导航方法。结果代码写得比 HashMap 还慢(因为红黑树开销白扛了)。

  • 必须用 TreeMapConcurrentSkipListMap 实例化,接口本身不能 new
  • NavigableMap 是接口,TreeMap 是它的标准实现;别写 new NavigableMap() —— 编译不过
  • 如果不需要反向遍历或边界查找,用 SortedMap 就够了,少一层抽象

ceilingKey()floorKey() 到底查的是“谁”

这两个方法名字容易让人脑补成“向上取整/向下取整”,但实际逻辑更接近“找最近的合法邻居”:前者返回 ≥ 给定 key 的最小键,后者返回 ≤ 给定 key 的最大键。没有匹配时返回 null(非 Optional!)。

典型场景:价格区间映射、时间戳对齐、分段配置查找。比如按毫秒时间戳查最近生效的配置项,用 floorEntry(timestamp) 比遍历 entrySet() 快得多。

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

海绵音乐
海绵音乐

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

下载
  • 输入 key 不存在时,ceilingKey(5) 在 {1=, 3=, 7=} 中返回 7,不是 null
  • key 比所有键都大,ceilingKey() 返回 null;比所有键都小,floorKey() 返回 null
  • 注意 null 安全:调用前最好判空,尤其在流式链式调用里(如 map.ceilingKey(k).toString() 会 NPE)

反向遍历用 descendingMap() 还是 descendingKeySet()

两者都返回逆序视图,但本质不同:descendingMap() 返回的是整个 NavigableMap 的反向代理,支持所有导航操作;descendingKeySet() 只是 Set 视图,不支持 higherKey() 等方法。

性能上没差异——都是 O(1) 返回视图,不复制数据。但误用会导致编译错误或逻辑错乱。比如想查“小于某值的最大键”,在反向 map 上该用 higherKey()(因为方向翻转了),而不是继续用 floorKey()

  • 需要继续做导航操作(如 lowerEntry()headMap()),必须用 descendingMap()
  • 只读键集合且要逆序迭代,descendingKeySet() 更轻量
  • descendingMap() 返回的 map 仍是线程不安全的,多线程下需额外同步

subMap() 的 fromInclusive / toInclusive 参数陷阱

这个四参数版本(subMap(fromKey, fromInclusive, toKey, toInclusive))最容易踩坑:两个布尔值控制的是**端点是否包含在结果中**,但底层仍依赖 key 的自然顺序或比较器。如果传入的 fromKey > toKey,直接抛 IllegalArgumentException——哪怕你设了 fromInclusive=false 也救不了。

典型错误是拿字符串做范围切片时忽略字典序,比如 subMap("a", true, "Z", true) 在 ASCII 下会为空(因为 "Z"

  • 务必确保 fromKeytoKey(按 map 的 Comparator 判断)
  • 如果不确定大小关系,先用 compare() 验证,别靠猜
  • 边界 key 不存在时,inclusive 参数仍生效:例如 subMap(2,true,4,false) 在 {1=,3=,5=} 中返回 {3=}

最麻烦的其实是自定义 Comparator 和 null 键混用——一旦 comparator 不支持 null,所有导航方法都会炸,而且错误信息里根本看不出是 comparator 的锅。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

252

2023.09.22

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

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

1029

2024.03.01

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

718

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

647

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1148

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1122

2024.04.29

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

19

2026.03.05

热门下载

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

精品课程

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

共23课时 | 4.1万人学习

C# 教程
C# 教程

共94课时 | 10.7万人学习

Java 教程
Java 教程

共578课时 | 77.3万人学习

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

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