java中iterator不能直接创建,必须通过实现iterable接口的集合(如arraylist、hashset等)调用iterator()方法获取;map需通过keyset()等视图获取;数组须先转list;不可new或由增强for反推。

Java 中的 Iterator 本身不能直接“创建”,它是集合类提供的访问接口,必须通过集合对象的 iterator() 方法获取。
哪些集合能获取 Iterator?
所有实现了 Iterable 接口的集合(如 ArrayList、LinkedList、HashSet、HashMap 的 keySet/valueSet/entrySet 等)都支持获取 Iterator。
-
Collection子接口(List、Set、Queue)都继承了Iterable,可直接调用iterator() -
Map本身不实现Iterable,但它的三个视图方法返回可迭代集合:map.keySet().iterator()、map.values().iterator()、map.entrySet().iterator() - 数组不能直接获取
Iterator,需先转为List(如Arrays.asList(arr).iterator())
如何正确获取 Iterator?
调用集合实例的 iterator() 方法,返回一个指向该集合当前状态的迭代器对象:
List<string> list = new ArrayList(Arrays.asList("a", "b", "c"));
Iterator<string> it = list.iterator(); // ✅ 正确:从集合实例获取</string></string>
注意:
- 不能 new Iterator() —— Iterator 是接口,没有公共构造方法;
- 不能用 for-each 循环反推 —— 增强 for 底层确实用了 Iterator,但不暴露引用,无法获取。
常见使用方式与注意事项
获取后通常配合 hasNext() 和 next() 遍历,也可用 remove() 安全删除当前元素:
- 遍历时修改原集合(除
iterator.remove()外)会触发ConcurrentModificationException -
Iterator是**单向、只读(除 remove)、fail-fast** 的 —— 不支持回退、不支持 set 修改元素值 - 若需双向或修改操作,考虑
ListIterator(仅限List)或普通 for 循环
小技巧:Stream 也能“模拟”迭代行为
虽然 Stream 不是 Iterator,但可通过 stream().iterator() 获取:
Iterator<integer> streamIt = list.stream().iterator(); // ✅ 合法,返回 Spliterator 包装的 Iterator</integer>
不过这属于流式处理的延伸用法,日常遍历仍推荐直接用集合的 iterator()。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











