TreeSet 本身不直接提供四参数 subSet 方法,该方法实际来自 NavigableSet 接口,TreeSet 自 JDK 6 起已实现;JDK 21+ 中作为默认方法正式支持,可直接调用 subSet(from, fromInclusive, to, toInclusive) 获取动态区间视图,边界由布尔值控制,元素无需实际存在集合中。

Java 中 TreeSet 本身**没有直接提供** subSet(from, fromInclusive, to, toInclusive) 这样的四参数方法。这个签名是 NavigableSet 接口定义的,而 TreeSet 实现了它——但要注意:该方法是从 JDK 21 开始才正式加入 TreeSet 的(作为 NavigableSet 的默认方法实现,且 TreeSet 在 JDK 21+ 中对其做了完整支持)。
确认你的 JDK 版本
如果你用的是 JDK 21 或更高版本,可以直接调用:
treeSet.subSet(from, fromInclusive, to, toInclusive)- 返回一个
NavigableSet视图(注意:是原集合的实时、可变子视图,修改会影响原 set) - 区间为闭区间或半开区间,由两个布尔值控制边界是否包含
JDK 20 及更早版本怎么办?
在 JDK 20 及之前,TreeSet 只有以下三个 subSet 方法:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
subSet(E fromElement, E toElement)→ 等价于[from, to)(左闭右开) -
subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive)→ 这个方法其实早在 JDK 1.6 就存在,但它属于NavigableSet接口,并且TreeSet从 JDK 6 起就实现了它!只是很多开发者误以为它不存在。
✅ 正确用法(JDK 6+ 都支持):
立即学习“Java免费学习笔记(深入)”;
TreeSet<Integer> set = new TreeSet<>(Arrays.asList(1, 3, 5, 7, 9, 11));
NavigableSet<Integer> range = set.subSet(3, true, 9, true); // [3, 9] → {3, 5, 7, 9}
使用时的关键细节
-
元素必须可比较:要么实现
Comparable,要么构造时传入Comparator,否则运行时报ClassCastException -
边界元素不必实际存在于 set 中:比如
subSet(4, true, 8, true)在 {1,3,5,7,9} 中会返回 {5,7}(因为 4 不在,但 >=4 的最小值是 5;8 不在,但 -
返回视图是强一致的:对原 set 的增删改会实时反映在子集中,反之亦然(例如通过子集
remove()也会从原 set 删除) -
如果 from > to(按自然顺序),返回空集合;若元素类型不匹配(如传入 null 而 set 不允许 null),抛
NullPointerException或ClassCastException
替代方案(兼容旧版本 & 更灵活控制)
如果想绕过 API 限制或需要更复杂的逻辑(比如排除 null 边界、处理异常),可以用 headSet/tailSet 组合:
- 想要
[from, to]:先tailSet(from, true),再对其headSet(to, true) - 但注意:两次视图嵌套后,某些操作(如
size())可能效率略低,且嵌套视图的修改行为与单层subSet完全等价

















