List迭代器和模拟(迭代器的模拟),【深度学习02】TensorBoard 基础与 torchvision 图像变换工具详解(附代码演示)。

张开发
2026/5/22 11:14:54 15 分钟阅读
List迭代器和模拟(迭代器的模拟),【深度学习02】TensorBoard 基础与 torchvision 图像变换工具详解(附代码演示)。
List迭代器的概念与作用List迭代器是Java集合框架中用于遍历List集合元素的接口继承自Iterator接口提供了双向遍历的能力。ListIterator允许向前或向后遍历列表并支持在遍历过程中修改列表结构。ListIterator的主要方法包括hasNext()、next()、hasPrevious()、previous()、add()、remove()和set()。ListIterator的核心优势在于支持双向遍历和修改操作。普通Iterator仅支持单向遍历而ListIterator可以在遍历过程中动态调整方向。ListIterator还支持在遍历过程中添加、删除或替换元素而不会引发ConcurrentModificationException异常。迭代器的基本实现原理迭代器模式通过将集合的遍历行为抽象为独立对象来实现。在Java中Iterator接口定义了hasNext()和next()方法集合类通过实现iterator()方法返回具体的迭代器实例。迭代器内部通常维护一个游标(cursor)来记录当前遍历位置。ArrayList的迭代器实现典型地使用内部类方式。迭代器内部保存了对原集合的引用和修改计数器(modCount)用于检测并发修改。每次调用next()方法时迭代器会检查modCount是否与初始值一致不一致则抛出ConcurrentModificationException。模拟List迭代器的实现步骤创建自定义ListIterator需要实现ListIterator接口的所有方法。基本结构包括维护当前索引位置、集合引用和修改计数器。正向遍历时索引递增反向遍历时索引递减。修改操作需要同步更新底层集合和修改计数器。public class CustomListIteratorE implements ListIteratorE { private final ListE list; private int cursor; private int lastRet -1; private int expectedModCount; public CustomListIterator(ListE list, int index) { this.list list; this.cursor index; this.expectedModCount list.modCount; } public boolean hasNext() { return cursor ! list.size(); } public E next() { checkForComodification(); int i cursor; E next list.get(i); lastRet i; cursor i 1; return next; } // 其他方法实现... }处理并发修改异常并发修改检测是迭代器的重要特性。迭代器初始化时记录集合的modCount值每次操作前比较当前modCount与记录值。集合结构发生变化时modCount会递增导致两者不一致时抛出ConcurrentModificationException。final void checkForComodification() { if (modCount ! expectedModCount) throw new ConcurrentModificationException(); }实现双向遍历功能ListIterator的双向遍历需要实现hasPrevious()和previous()方法。hasPrevious()检查游标是否大于0previous()返回前一个元素并将游标前移。需要特别注意边界条件和初始状态处理。public boolean hasPrevious() { return cursor ! 0; } public E previous() { checkForComodification(); int i cursor - 1; E previous list.get(i); lastRet cursor i; return previous; }实现修改操作的方法add()方法在当前游标位置插入元素set()方法替换最后访问的元素remove()方法删除最后访问的元素。这些操作都需要更新modCount并调整游标位置。特别注意操作顺序对游标位置的影响。public void add(E e) { checkForComodification(); list.add(cursor, e); lastRet -1; expectedModCount list.modCount; } public void set(E e) { if (lastRet 0) throw new IllegalStateException(); checkForComodification(); list.set(lastRet, e); }迭代器性能优化考虑大型集合的迭代器性能优化可以从几个方面着手减少边界检查次数、预计算集合大小、使用快速失败机制提前终止无效遍历。对于随机访问集合如ArrayList直接索引访问比链表遍历更高效。延迟初始化策略可以提升迭代器创建性能。仅在首次使用时初始化状态变量避免不必要的初始化开销。对于只读场景可以省略并发修改检查来提升性能。迭代器模式的应用场景迭代器模式特别适合需要多种遍历方式的集合或需要隐藏集合内部结构的场景。树形结构的前序、中序、后序遍历可以通过不同迭代器实现。图形结构的深度优先和广度优先遍历也适合用迭代器模式封装。多线程环境下的快照迭代器是常见应用。创建迭代器时复制集合内容避免并发修改问题。虽然消耗内存但保证了遍历期间的一致性。这种模式在实时数据分析系统中很常见。https://github.com/dahlias-toying-6e/5xz_9w33/issues/4https://github.com/37plan-marts/iw0_jyr4/issues/4https://github.com/jolly-nucleus59/jdz_owcr/issues/4https://github.com/allures-boogies-0t/6h3_7j2k/issues/4https://github.com/ketchup99mention/1yp_9exa/issues/4

更多文章