Java Iterator默认仅支持读和remove(),调用add()/set()等会抛UnsupportedOperationException;ArrayList、HashSet、Map视图等的迭代器均不可写;需写操作时应改用ListIterator、普通for循环、addAll()或并发集合。

Java 中的 Iterator 默认只支持读和删除(remove()),不支持添加、替换等写操作。一旦尝试调用未实现的方法(如 add()、set()),会抛出 UnsupportedOperationException。这不是 bug,而是设计使然——多数集合的迭代器是“只读快照”,修改结构可能破坏遍历一致性。
明确哪些 Iterator 不支持写操作
以下常见场景返回的 Iterator 均不支持写操作:
-
ArrayList.iterator()、LinkedList.iterator():仅支持remove() -
HashSet.iterator()、TreeSet.iterator():同上,add()和set()直接抛异常 -
Map.keySet().iterator()、Map.values().iterator():底层仍是集合视图的迭代器,不可写 - 数组或集合通过
Arrays.asList()包装后返回的List,其iterator()也不支持add()/set()
需要写操作时的替代方案
根据具体需求选择合适方式,避免强行调用不支持的方法:
-
要边遍历边添加元素:改用普通
for循环 + 索引(适用于ArrayList等随机访问集合),或收集待添加元素,遍历结束后统一addAll() -
要修改当前元素值:对
List使用ListIterator(它支持set()和add());对Map则直接通过entrySet()的setValue()修改 -
要安全删除多个元素:仍可用
Iterator.remove()(它是唯一线程安全的删除方式);或用 Java 8+ 的removeIf()方法 -
需完全控制结构变更:转为使用支持并发修改的集合,如
CopyOnWriteArrayList(适合读多写少)或ConcurrentHashMap
用 ListIterator 替代普通 Iterator 实现写操作
ListIterator 是 Iterator 的子接口,专为 List 设计,支持双向遍历和写操作:
立即学习“Java免费学习笔记(深入)”;
// 示例:替换偶数索引位置的元素
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c", "d"));
ListIterator<String> lit = list.listIterator();
while (lit.hasNext()) {
String s = lit.next();
if (lit.nextIndex() % 2 == 0) {
lit.set("REPLACED"); // ✅ 合法:修改当前元素
lit.add("NEW"); // ✅ 合法:在当前位置后插入
}
}
注意:ListIterator 不能用于 Set 或 Map 视图,且必须由 List 实例提供。
避免陷阱:别混淆 “不可变集合” 和 “不可写迭代器”
有些集合本身是不可变的(如 Collections.unmodifiableList() 包装的结果),它的 iterator() 抛出异常不仅因为不支持写,更因底层数组/集合被冻结。此时连 remove() 都会失败。解决方法是确保操作的是可变集合实例,必要时先创建新副本:
- 用
new ArrayList(original)复制一份再操作 - 用
Stream.collect(Collectors.toCollection(ArrayList::new))构建新集合 - 对不可变 Map,用
new HashMap(original)转为可变


















