# Iterator

## Collection中的迭代器

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

![image-20220303173839837](https://2351062869-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7b2CdwBN9liniVJpfEAc%2Fuploads%2Fgit-blob-bbc91e38d7f70bc22da9b5e8eecd5e82fd0ad342%2Fimage-20220303173839837.png?alt=media)

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

### ArrayList 的Iterable实现

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

![image-20220303174349942](https://2351062869-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7b2CdwBN9liniVJpfEAc%2Fuploads%2Fgit-blob-0dac47a4adc4d4df6327921683591aca2573d876%2Fimage-20220303174349942.png?alt=media)

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

![image-20220303174519004](https://2351062869-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7b2CdwBN9liniVJpfEAc%2Fuploads%2Fgit-blob-7427b8728e8e440dc902804fe329e2924638c695%2Fimage-20220303174519004.png?alt=media)

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

## List 的 ListIterator 迭代器

![image-20220303175134871](https://2351062869-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7b2CdwBN9liniVJpfEAc%2Fuploads%2Fgit-blob-cd24df69f95ccf03abedcfeeb0bc78cb787460d6%2Fimage-20220303175134871.png?alt=media)

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

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

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

### ArrayList的ListIterator实现

![image-20220303175539412](https://2351062869-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7b2CdwBN9liniVJpfEAc%2Fuploads%2Fgit-blob-9ebdd978f50412b90c7a34cdae844134b3063565%2Fimage-20220303175539412.png?alt=media)

其中`ListItr`如下：

![image-20220303175952965](https://2351062869-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7b2CdwBN9liniVJpfEAc%2Fuploads%2Fgit-blob-4de707b655671257341788baf02a945fc7931dd1%2Fimage-20220303175952965.png?alt=media)
