floorkey返回小于等于目标的最大键,ceilingkey返回大于等于目标的最小键;二者均基于红黑树有序性实现o(log n)查找,null表示无匹配键,常用于范围查询与边界对齐。

在 TreeMap 中,floorKey 和 ceilingKey 是两个非常实用的边界查找方法,它们基于红黑树的有序特性,能快速定位“不大于”或“不小于”指定键的最近键。用对了,比遍历或手写二分高效得多,也更安全。
floorKey:找“不大于目标的最大键”
floorKey(K key) 返回小于等于 key 的最大键;如果不存在这样的键(比如 key 比所有键都小),返回 null。注意它不关心值,只看键的自然顺序或自定义比较器顺序。
- 若
key本身存在,直接返回该键 - 若
key不存在,返回前一个“紧邻”的键(即前驱) - 例如:
map = {1="a", 3="b", 5="c"},floorKey(4)→3,floorKey(0)→null
ceilingKey:找“不小于目标的最小键”
ceilingKey(K key) 返回大于等于 key 的最小键;若不存在(如 key 比所有键都大),也返回 null。
- 若
key存在,直接返回该键 - 若
key不存在,返回后一个“紧邻”的键(即后继) - 例如:
map = {1="a", 3="b", 5="c"},ceilingKey(2)→3,ceilingKey(6)→null
配合使用实现闭区间查找
要查键落在 [from, to] 区间内的所有映射,可先用 ceilingKey(from) 找起点,再用 floorKey(to) 找终点,然后用 subMap(from, true, to, true) 或循环遍历——但更推荐直接用 subMap,它底层也是基于类似逻辑,且线程安全(视具体 TreeMap 实例而定)。
- 避免手动 while 循环 +
higherKey,易出错且效率低 - 注意:
subMap返回的是原 map 的视图,修改会反映到原 map - 如果只需判断是否存在满足条件的键,用
floorKey或ceilingKey单次调用即可,O(log n)
空值和 null 键的注意事项
TreeMap 默认不允许 null 键(构造时未传比较器),否则抛 NullPointerException;若用了允许 null 的比较器(如 Comparator.nullsFirst(...)),则 floorKey(null) 和 ceilingKey(null) 才有意义,行为取决于比较器定义。
- 始终检查返回值是否为
null,尤其在边界场景下 - 不要假设
floorKey(x) != null就一定有对应 value —— 要用get()显式取值 - 浮点数作键需谨慎:精度问题可能导致预期外的 floor/ceiling 结果
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











