TreeSet的subSet、tailSet、headSet是动态视图而非副本,直接复用红黑树结构,修改实时同步;subSet默认左闭右开,tailSet默认含起点,headSet默认不含终点;视图与原集合双向联动,size()动态计算,继承原Comparator。

TreeSet 的 subSet、tailSet、headSet 不是“配置”出来的,而是调用对应方法获取的动态视图。它们不复制数据,直接复用底层红黑树结构,修改视图或原集合会实时同步。
subSet:按区间截取,注意默认左闭右开
最常用的是 subSet(E fromElement, E toElement),返回 [fromElement, toElement) 的子集视图(含起始,不含终止)。
- 要求
fromElement ≤ toElement(按 TreeSet 使用的 Comparator 规则),否则抛IllegalArgumentException - 端点不必存在于原集合中,但必须能被 Comparator 正确比较(例如自然排序时传 String,就不能传 Integer)
- 想改成闭区间?用四参数重载:
subSet(from, true, to, true)—— Java 7 起支持 - 示例:
set.subSet(5, 10)返回 {5,6,7,8,9};若要包含 10,写成set.subSet(5, true, 10, true)
tailSet:从某值开始,默认包含起点
tailSet(E fromElement) 返回所有 ≥ fromElement 的元素视图。
- 等价于
tailSet(fromElement, true),即默认包含fromElement - 如需严格大于(开区间),显式调用
tailSet(fromElement, false) - 若
fromElement大于所有现存元素,返回空视图(isEmpty() == true)
headSet:截止到某值,默认不包含终点
headSet(E toElement) 返回所有 < toElement 的元素视图。
立即学习“Java免费学习笔记(深入)”;
- 等价于
headSet(toElement, false),即默认不包含toElement - 如需包含终点(≤),用
headSet(toElement, true) - 若
toElement小于等于最小元素,返回空视图
关键注意事项
这些视图不是快照,而是实时双向绑定的导航视图:
- 对视图增删元素,原 TreeSet 立刻变化;反之亦然
- 遍历时若同时修改原集合(或另一视图),可能触发
ConcurrentModificationException -
size()在 subSet 中是 O(log n),非缓存值,每次调用都动态计算区间节点数 - 所有视图完全继承原 TreeSet 的 Comparator,无需额外设置
- 若 TreeSet 使用自然排序,不能插入
null;自定义 Comparator 可自行决定是否支持null


















