Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

Iterator 和 ListIterator 有什么区别?

查看完整题解

参考回答

直接回答

Iterator 是通用的向前迭代接口,主要提供 hasNext、next 和可选的 remove。ListIterator 面向 List,在此基础上增加向后遍历、获取游标位置,以及可选的 add、set。需要双向移动或在遍历中插入列表元素时,ListIterator 更合适。

讲清原理

可以把列表游标想成两个元素之间的书签,而不是某一个元素。next() 取出右侧元素并向右移动;previous() 取出左侧元素并向左移动。nextIndex() 返回下一次 next() 对应的下标。

remove 和 set 针对最近一次由 next 或 previous 返回的元素;调用顺序受限制。add 在游标处插入元素,并不是“替换当前元素”。这些修改操作都是可选能力,固定长度列表或不可修改列表可能抛 UnsupportedOperationException。

例子与易错点

var names = new java.util.ArrayList<>(java.util.List.of("A", "B"));
var it = names.listIterator();
it.next();       // A
it.set("a");    // 替换 A
it.add("X");    // 插入到 a 与 B 之间
System.out.println(names); // [a, X, B]

ListIterator 不保证并发安全。双向遍历、是否支持修改、是否线程安全,是三个不同的问题。

相关题:第 3 题、第 42 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。