floor(E e)返回≤e的最大元素,ceiling(E e)返回≥e的最小元素,二者均不依赖e是否存在于集合中,不存在时返回null,时间复杂度均为O(log n)。

ConcurrentSkipListSet 的 floor 和 ceiling 方法用于在并发安全的有序集合中查找最接近指定元素的匹配项,它们不返回任意近似值,而是严格遵循“小于等于”或“大于等于”的语义,且时间复杂度为 O(log n)。
floor(E e):找不大于 e 的最大元素
该方法返回集合中 ≤ e 的最大元素;若不存在,则返回 null。注意它不要求 e 本身存在于集合中,只要存在满足条件的元素即可。
- 如果 e 在集合中,直接返回 e
- 如果 e 不在集合中,但有比它小的元素(如集合有 {1,3,5},e=4),则返回 3
- 如果所有元素都 > e(如 e=0),返回 null
- 如果集合为空,也返回 null
ceiling(E e):找不小于 e 的最小元素
该方法返回集合中 ≥ e 的最小元素;若不存在,则返回 null。同样不要求 e 存在,只关注下界逼近。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 如果 e 在集合中,直接返回 e
- 如果 e 不在集合中,但有比它大的元素(如集合有 {1,3,5},e=4),则返回 5
- 如果所有元素都
- null 值不能作为参数传入,否则抛出 NullPointerException
与 TreeSet 的 floor/ceiling 行为一致
ConcurrentSkipListSet 是 SortedSet 的线程安全实现,其 floor 和 ceiling 语义与 TreeSet 完全相同,区别仅在于底层用跳表替代红黑树,支持高并发读写而无需全局锁。
立即学习“Java免费学习笔记(深入)”;
- 两者都基于比较器(自然顺序或自定义 Comparator)判断大小关系
- 比较逻辑必须与 equals 保持一致(即 compare(a,b)==0 ⇔ a.equals(b)),否则行为可能不符合直觉
- 不支持 null 元素(除非使用允许 null 的 Comparator,但 ConcurrentSkipListSet 明确禁止 null)
实际使用注意事项
由于是并发集合,floor 和 ceiling 操作本身是线程安全的,但结果仅反映调用瞬间的状态 —— 无法保证后续操作仍满足该关系。
- 不要依赖返回值做条件更新(如“if floor(x) != null then remove it”),应结合原子操作或重试逻辑
- 避免在循环中反复调用 floor/ceiling 查找边界,可考虑用 subSet 或 headSet 配合迭代器提升效率
- 若需同时获取 floor 和 ceiling,两次调用是独立的,中间可能有其他线程修改集合

















