TreeSet的ceiling、floor、higher、lower方法均用于O(log n)时间复杂度的边界查询:ceiling(E e)返回≥e的最小元素,floor(E e)返回≤e的最大元素;higher(E e)返回>e的最小元素,lower(E e)返回<e的最大元素。

TreeSet 的 ceiling、floor、higher、lower 这四个方法用于在有序集合中快速查找与给定元素最接近的边界元素,它们不修改集合,只做查询,且时间复杂度为 O(log n)。关键区别在于是否包含等于目标值的情况,以及偏向“上界”还是“下界”。
ceiling 和 floor:含等号的最近边界
ceiling(E e) 返回大于等于 e 的最小元素;floor(E e) 返回小于等于 e 的最大元素。如果不存在,返回 null(注意:TreeSet 不允许 null 元素,但方法可接受 null 参数并返回 null)。
- 当
e本身在集合中时,ceiling(e)和floor(e)都返回e - 若
e小于所有元素,ceiling(e)返回最小元素,floor(e)返回null - 若
e大于所有元素,floor(e)返回最大元素,ceiling(e)返回null
higher 和 lower:严格不等的最近邻
higher(E e) 返回严格大于 e 的最小元素;lower(E e) 返回严格小于 e 的最大元素。二者都不包含等于 e 的情况。
- 即使
e存在于集合中,higher(e)也跳过它,找下一个更大的 - 若
e是最大元素,higher(e)返回null;同理,e是最小元素时,lower(e)返回null - 它们的行为类似数学中的“上确界”和“下确界”,但只取实际存在的元素
实际使用注意事项
这四个方法都要求元素类型实现 Comparable,或 TreeSet 构造时传入 Comparator。调用时传入的参数类型必须与集合元素兼容,否则抛 ClassCastException。
立即学习“Java免费学习笔记(深入)”;
- 返回值类型为
E,即集合元素类型,不是包装类或子类的自动转换结果 - 对空 TreeSet 调用任一方法均返回
null - 避免在多线程环境下直接使用非同步的 TreeSet,必要时用
Collections.synchronizedSortedSet包装
一个简单例子帮你分清四者
假设 TreeSet 包含 [1, 3, 5, 7, 9]:
-
ceiling(5)→5(等于,包含) -
floor(5)→5(等于,包含) -
higher(5)→7(严格大于) -
lower(5)→3(严格小于) -
ceiling(4)→5(向上找最小满足 ≥4 的) -
floor(4)→3(向下找最大满足 ≤4 的)


















