Java Iterator忠实反映集合自身遍历顺序,不决定也不改变顺序:ArrayList等按插入序,TreeSet按排序序,HashSet无固定序;仅单向前向遍历,不支持跳转或反向;遍历时修改集合需用iterator.remove()以避免异常。

Java Iterator 本身不决定顺序,而是**忠实反映集合自身的遍历顺序**。它提供统一的“取下一个”的能力,但这个“下一个”具体是谁,完全由集合类型和其实现决定。
不同集合的顺序表现
Iterator 只是把集合内部的顺序逻辑暴露出来,不干预也不重排:
- ArrayList / LinkedList:按插入顺序(即索引递增顺序)遍历,Iterator.next() 依次返回第0个、第1个、第2个……元素;
- LinkedHashSet / LinkedHashMap:按插入顺序遍历,Iterator 保持元素被添加时的先后关系;
- TreeSet / TreeMap:按自然顺序(或自定义Comparator)排序后遍历,Iterator 从最小元素开始,逐个返回升序排列的元素;
- HashSet / HashMap 的 keySet():无固定顺序(基于哈希桶分布),每次遍历可能不同,Iterator 仅按当前内部结构的迭代路径走;
- PriorityQueue:Iterator 不保证按优先级顺序返回(其迭代器是“弱一致性”的),如需有序访问,应反复调用poll()而非依赖iterator()。
Iterator 自身不支持跳转或反向遍历
标准 Iterator 是单向、前向、游标式设计:
- 只能通过 hasNext() + next() 一步步推进,不能回退、不能随机访问第n个元素;
- 没有 previous()、hasPrevious() 或 get(int index) 方法;
- 若需双向遍历,应使用 ListIterator(仅 List 支持),它继承 Iterator 并扩展了反向操作。
顺序访问的安全边界
Iterator 的顺序行为依赖于集合的结构稳定性:
立即学习“Java免费学习笔记(深入)”;
- 遍历时**禁止直接调用集合的修改方法**(如 list.remove(obj)、set.add()),否则会触发 ConcurrentModificationException;
- 唯一安全的修改方式是调用 iterator.remove(),它会同步更新迭代器状态,维持顺序遍历的连续性;
- 多线程环境下,即使只读遍历,也建议使用并发集合(如 CopyOnWriteArrayList)或加锁,避免结构突变导致行为异常。
增强 for 循环本质就是 Iterator
写法 for (String s : list) 看似简洁,底层仍调用 list.iterator(),并按 hasNext()/next() 执行顺序访问。它只是语法糖,不改变顺序语义,也不支持遍历中删除(会抛异常)。


















