ListIterator.set(E)是唯一可在遍历中安全替换当前元素的方法,需先调用next()或previous()进入有效状态,否则抛IllegalStateException;它仅更新当前游标位置元素,不改变列表结构。

Java 中不能直接通过 ListIterator 的 next() 或 previous() 获取的元素引用去“赋值修改”,因为那只是返回一个对象引用,修改它不等于修改列表结构中的元素。但你可以用 ListIterator.set(E) 方法安全地**替换当前游标位置的元素**——这是唯一被设计用于遍历中修改当前元素的合法方式。
必须先调用 next() 或 previous() 才能 set()
set() 方法要求迭代器必须处于“已返回元素”的状态(即刚调用过 next() 或 previous()),否则会抛出 IllegalStateException。
- 刚创建的
ListIterator,未调用任何移动方法,直接set()→ 报错 - 调用
next()后,立刻set(newObj)→ 合法,替换刚刚返回的那个元素 - 连续调用两次
next()后再set()→ 报错(中间缺了一次next()对应的“当前”状态)
set() 只替换值,不改变列表大小或结构
set() 不是添加也不是删除,它仅就地更新当前游标指向位置的元素引用(对引用类型)或值(对基本类型包装类)。原列表长度、索引顺序、其他元素均不受影响。
List<string> list = new ArrayList(Arrays.asList("a", "b", "c"));
ListIterator<string> it = list.listIterator();
it.next(); // 游标移到 "a",当前元素是 "a"
it.set("A"); // 替换索引 0 处的元素 → list 变为 ["A", "b", "c"]
it.next(); // 移到 "b"
it.set("B"); // 替换索引 1 处的元素 → list 变为 ["A", "B", "c"]</string></string>
注意和 add()、remove() 的区别
三者用途不同,不能混用:
-
set(E):必须有“当前元素”,只替换,不移位 -
add(E):在当前游标位置**之前**插入新元素,后续元素索引+1,游标停留在新元素之后 -
remove():删除上一次next()或previous()返回的元素,游标自动回退一位(逻辑上“补位”)
多次调用 set() 是安全的;但连续调用 remove() 或 add() 后再 set(),需确保状态有效——例如 remove() 后未再 next() 就 set(),同样抛异常。
不支持对不可变/只读列表使用 set()
如果底层列表本身不支持修改(如 Collections.unmodifiableList() 包装的列表),即使用了 ListIterator,调用 set() 也会抛 UnsupportedOperationException。请确认原始列表是可修改的(如 ArrayList、LinkedList)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











