- Collection接口实现了继承了Iterable接口,实现类例如ArrayList可以调用 iterator() 方法获取迭代器Iterator 对象。
- Iterable 是一个接口(英文翻译为可被迭代的),返回了具体的迭代器对象 Iterator。
- Collection的实现类们将迭代器作为一个内部类在类中进行了实现,JDK源码中大量运用了这种内部类实现的方式去代理,很好的阐释了封装的概念。
- 以ArrayList为例,Iterator的实现类就是Itr。
- Iterator的实现(以ArrayList的Itr为例):
-
- Iterator 会保存当前的元素在数组中的下标(int cursor,默认0),以及上一个元素在数组中的下标(int lastRet,默认-1)。
- next方法:
- 根据cursor提供的下标+1获取下一个元素并返回(当数组中还有元素时)。
- 获取elementData的数组地址的引用,elementData属性就是ArrayList保存数据的数组属性。
- 最后将cursor+1赋值给cursor,将原来的cursor即i赋值给lastRet。
- remove方法:
- 根据lastRet删除上一个元素,并且迭代器是没有一个集合的数组的拷贝的,调用集合的remove()方法真实删除当前集合里的元素
- 迭代器的remove方法调用集合的remove(),删除元素后会对数组重新排序,因此可以在迭代器循环中边循环边删除上一个元素,因为每次迭代找元素靠的还是下标而不是元素本身。