ListIterator 的 set(E e) 方法用于安全替换最近一次 next() 或 previous() 返回的元素,需先调用迭代方法,且不可与 add()、remove() 连续调用,否则抛 IllegalStateException。

Java 的 ListIterator 支持在遍历时安全地修改元素,核心方法是 set(E e) —— 它会用指定元素替换上一次调用 next() 或 previous() 返回的元素。
必须先调用 next() 或 previous() 才能 set()
set() 不是“按索引设置”,而是“替换最近一次迭代返回的那个元素”。如果还没调用过 next() 或 previous(),或上次操作后已调用过 add()、remove(),再调用 set() 会抛出 IllegalStateException。
- ✅ 正确:先
next()→ 得到元素 → 再set(newVal) - ❌ 错误:直接
it.set("x")(未触发移动) - ❌ 错误:
next()→add("y")→set("z")(add 后状态失效)
set() 只替换,不改变列表结构
set() 是纯粹的“就地更新”,不会影响列表长度,也不会移动迭代器位置。调用后,nextIndex() 和 previousIndex() 值保持不变,后续仍可继续 next() 或 previous()。
- 例如:遍历到第 2 个元素(索引 1),
set("new")后,列表大小不变,下一次next()仍返回第 3 个元素 - 它和
list.set(index, e)效果一致,但更符合迭代上下文
和 remove()/add() 的配合限制
set()、remove()、add() 三者互斥:任意一个成功执行后,其他两个在下次移动前都不可用。
- 调用
next()→set(...)✅ → 再set(...)❌(需再次next()) - 调用
next()→remove()✅ → 此时set(...)和remove()都会报错 - 调用
next()→add(...)✅ → 迭代器位置已变,原“最近元素”概念失效,set()失效
完整示例:把所有 "apple" 替换为 "orange"
(注意检查 hasNext() 并只在 next() 后 set)
List<string> list = new ArrayList(Arrays.asList("apple", "banana", "apple"));
ListIterator<string> it = list.listIterator();
while (it.hasNext()) {
String s = it.next();
if ("apple".equals(s)) {
it.set("orange"); // ✅ 安全替换
}
}
// 结果:["orange", "banana", "orange"]
</string></string>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











