NavigableMap 的核心价值是 O(log n) 时间内定位最接近指定键的键或键值对。它提供 lowerKey/floorKey/ceilingKey/higherKey 四种严格语义的导航方法,对应不同数学关系;*Entry() 方法直接返回键值对,避免二次查找;配合 subMap/tailMap 可限定范围导航;descendingMap() 支持逆序查找;所有导航方法无匹配时返回 null,pollFirstEntry/pollLastEntry 兼具获取与删除功能。

Java 中 NavigableMap 的核心价值之一,就是能快速找到“不完全相等但最接近”的键及其对应值。它不依赖遍历,而是利用底层红黑树的有序结构,在 O(log n) 时间内完成定位。
四种基础匹配逻辑要分清
每种方法对应一种数学关系,返回的是键本身(不是键值对):
- lowerKey(k):小于 k 的最大键(严格小于)
- floorKey(k):小于或等于 k 的最大键(不大于)
- ceilingKey(k):大于或等于 k 的最小键(不小于)
- higherKey(k):大于 k 的最小键(严格大于)
例如 map = {10="Ten", 15="Fifteen", 20="Twenty"}:floorKey(12) → 10,ceilingKey(12) → 15,higherKey(15) → 20,lowerKey(10) → null(无更小键)。
直接拿到键值对更高效
如果目标是获取值,用 *Entry() 方法比先查键再 get() 更优——避免二次查找,且线程安全场景下更可靠:
-
floorEntry(12)返回10=Ten -
ceilingEntry(17)返回20=Twenty -
higherEntry(20)返回null -
firstEntry()和lastEntry()分别取边界条目
配合子视图做范围+最近匹配
实际业务中常需“在某个时间段内找最接近的时间戳”,这时先用 subMap 或 tailMap 缩小范围,再调用导航方法:
-
tailMap(12, true)得到 ≥12 的子映射,再firstEntry()等价于ceilingEntry(12) -
subMap(5, true, 18, false)表示 [5, 18),再对其调用floorEntry(12)就限定在该区间内找 -
descendingMap()可逆序后用lowerEntry实现“倒序最近”逻辑
注意空值与边界行为
所有导航方法在无匹配时返回 null(非抛异常),使用前应判空:
- 对空 map 调用任意导航方法都返回 null
-
pollFirstEntry()和pollLastEntry()不仅返回,还会移除元素,适合实现优先队列或滑动窗口淘汰 - 所有视图(如
descendingMap()、headMap())是实时联动的,修改视图即修改原 map










