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 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。