listiterator 是 list 专属双向迭代器,支持正反向遍历、元素增删改及索引获取;通过 list.listiterator() 或 list.listiterator(index) 获取,游标初始位置影响遍历起点。

ListIterator 是 Java 中 List 接口专属的迭代器,支持**双向遍历**(向前和向后)、**元素修改**、**插入新元素**,还能获取当前索引位置。它比普通 Iterator 功能更丰富,但仅适用于 List 及其子类(如 ArrayList、LinkedList)。
如何获取 ListIterator
调用 List 的 listIterator() 方法即可获得:
-
list.listIterator():从头开始(索引 0) -
list.listIterator(index):从指定索引位置开始(索引合法范围为0到list.size(),含边界)
正向遍历(从前往后)
使用 hasNext() + next(),类似普通 Iterator:
List<string> list = Arrays.asList("a", "b", "c");
ListIterator<string> lit = list.listIterator();
while (lit.hasNext()) {
System.out.print(lit.next() + " "); // 输出:a b c
}</string></string>
注意:next() 返回当前元素,并将游标移到下一个位置;nextIndex() 返回下一次 next() 将访问的索引(即游标当前位置)。
反向遍历(从后往前)
使用 hasPrevious() + previous():
ListIterator<string> lit = list.listIterator(list.size()); // 游标置于末尾(索引 3)
while (lit.hasPrevious()) {
System.out.print(lit.previous() + " "); // 输出:c b a
}</string>
关键点:list.listIterator(list.size()) 把游标放在列表末尾(不是最后一个元素,而是“末尾之后”的位置),这样第一次 previous() 才能取到最后一个元素。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
边遍历边修改(安全且灵活)
ListIterator 允许在遍历时安全地增删改,不会引发 ConcurrentModificationException:
-
set(E e):替换上一次next()或previous()返回的元素(必须先调用过next()/previous()) -
add(E e):在游标当前位置插入新元素(插入后游标位于新元素之后) -
remove():删除上一次next()或previous()返回的元素(同set,需先调用)
例如,在遍历时把所有 "b" 替换为 "B":
List<string> list = new ArrayList(Arrays.asList("a", "b", "c", "b"));
ListIterator<string> lit = list.listIterator();
while (lit.hasNext()) {
String s = lit.next();
if ("b".equals(s)) lit.set("B");
}
// list 变为 ["a", "B", "c", "B"]</string></string>
获取当前位置信息
ListIterator 提供两个重要索引方法:
-
nextIndex():返回下一次next()将访问的索引(范围:0 到size()) -
previousIndex():返回下一次previous()将访问的索引(范围:-1 到size()-1)
例如,初始时 list.listIterator() 的 nextIndex() 是 0,previousIndex() 是 -1;调用一次 next() 后,nextIndex() 变为 1,previousIndex() 变为 0。
不复杂但容易忽略:ListIterator 不是线程安全的,多线程操作仍需同步;它只属于 List,不能用于 Set 或 Map。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










