TreeSet 不支持索引访问,因其底层为红黑树结构,元素按排序顺序存储但无连续下标;遍历时只能用迭代器、增强 for 循环或流式 API。

TreeSet 是 Java 中基于红黑树实现的有序集合,遍历它本质上就是按自然顺序(或自定义比较器顺序)访问元素——但关键在于:它不支持索引访问,也不能用传统 for 循环靠下标遍历。
为什么不能用 for (int i = 0; i 遍历?
因为 TreeSet 没有实现 List 接口,也没有 get(int index) 方法。强行写这种循环会编译报错:Cannot resolve method 'get' in 'TreeSet'。它的底层是树结构,不是数组或链表,没有“第 i 个元素”的概念。
推荐的三种遍历方式及适用场景
实际开发中优先选增强 for 或迭代器;需要中途移除元素时必须用迭代器。
- 增强 for 循环:最简洁,适合只读遍历
-
Iterator:支持安全删除(iterator.remove()),避免ConcurrentModificationException -
forEach()+ Lambda:Java 8+,语义清晰,但无法中断或 break
TreeSetset = new TreeSet<>(Arrays.asList("banana", "apple", "cherry")); // 方式1:增强for for (String s : set) { System.out.println(s); // apple → banana → cherry } // 方式2:迭代器(可删除) Iterator it = set.iterator(); while (it.hasNext()) { String s = it.next(); if ("banana".equals(s)) it.remove(); // 安全删除 } // 方式3:forEach set.forEach(System.out::println);
遍历时修改集合的常见陷阱
TreeSet 的迭代器是“快速失败”(fail-fast)的。只要在遍历过程中用集合自身方法(如 set.remove())修改结构,就会抛出 ConcurrentModificationException。
立即学习“Java免费学习笔记(深入)”;
- ❌ 错误:在增强 for 中调用
set.remove(x) - ✅ 正确:只能通过
Iterator.remove()删除当前元素 - ⚠️ 注意:即使只是插入新元素(
set.add()),也会触发异常
性能与排序逻辑的隐含影响
TreeSet 遍历的时间复杂度是 O(n),看似线性,但背后是中序遍历红黑树,每次 next() 都涉及树节点跳转。如果集合很大(比如 10 万以上元素),且你只需要前几个最小/最大值,别盲目遍历全部——改用 pollFirst() 或 pollLast() 更高效。
另外,遍历顺序完全由 Comparator 或元素的 compareTo() 决定。如果自定义比较器返回 0 表示相等,会导致元素被去重——这不是遍历问题,而是插入阶段就丢数据了,得回头检查比较逻辑。










