> For the complete documentation index, see [llms.txt](https://yangsx95.gitbook.io/notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yangsx95.gitbook.io/notes/programming-language/java/ji-he/iterator.md).

# Iterator

## Collection中的迭代器

`Collection` 继承了 `Iterable`接口：

![image-20220303173839837](/files/FTJm7KnhoL3pi1yOAsMQ)

`iterator()`方法用于返回一个迭代器，供`forEach`循环。

### ArrayList 的Iterable实现

以`ArrayList`为例，他的`iterator`方法为：

![image-20220303174349942](/files/WnQWwTAcvzZJrBXRDh8f)

其中，`Itr`是`ArrayList`的一个内部类，具体完成了迭代器的实现：

![image-20220303174519004](/files/aAjnKRLpZ8oQy9Hq5l80)

1. 内部有一个指针`cursor`，用于记录当前的迭代位置
2. 每迭代一次，`cursor`就向后移动一位
3. forEach循环将会使用该迭代器，如果发生并发修改，则会发生并发修改异常

## List 的 ListIterator 迭代器

![image-20220303175134871](/files/EbNBzagykfgjAxO5k4ew)

List 接口同样提供了两个返回迭代器方法，并返回`ListIterator`类型的迭代器。

### 为什么需要ListIterator迭代器？

主要是为了解决Iterator迭代器的并发修改异常的问题。

### ArrayList的ListIterator实现

![image-20220303175539412](/files/LIZJqTvOk5D5jPzdvKqi)

其中`ListItr`如下：

![image-20220303175952965](/files/mflKlqg13zK33b3rmNt1)
