07 Iterable&Ieterator
Iterator Iterable ListIterator
1 Iterator
所有Java集合类都提供iterator()方法,该方法返回Iterator的实例以遍历该集合中的元素。
1 | public interface Iterator<E> { |
提供的API接口含义如下:
hasNext():判断集合中是否存在下一个对象next():返回集合中的下一个对象,并将访问指针移动一位remove():删除集合中调用next()方法返回的对象.每次调用next()只能调用一次此方法。
在早期,遍历集合的方式只有一种,通过Iterator迭代器操作
1 | List<Integer> list = new ArrayList<>(); |
2 Iterable
1 | public interface Iterable<T> { |
可以看到Iterable接口里面提供了Iterator接口,所以实现了Iterable接口的集合依旧可以使用迭代器遍历和操作集合中的对象;
而在 JDK 1.8中,Iterable提供了一个新的方法forEach(),它允许使用增强 for 循环遍历对象。
1 | List<Integer> list = new ArrayList<>(); |
我们通过命令:javap -c反编译上面的这段代码后,发现它只是 Java 中的一个语法糖,本质上还是调用Iterator去遍历。

翻译成代码,就和一开始的Iterator迭代器遍历方式基本相同了。
1 | Iterator iter = list.iterator(); |
还有更深层次的探讨:为什么要设计两个接口
Iterable和Iterator,而不是保留其中一个就可以了。简单讲解:
Iterator的保留可以让子类去实现自己的迭代器,而Iterable接口更加关注于for-each的增强语法。具体可参考:Java中的Iterable与Iterator详解
3 Iterator 和Iterable
关于Iterator和Iterable的讲解告一段落,下面来总结一下它们的重点:
Iterator是提供集合操作内部对象的一个迭代器,它可以遍历、移除对象,且只能够单向移动Iterable是对Iterator的封装,在JDK 1.8时,实现了Iterable接口的集合可以使用增强 for 循环遍历集合对象,我们通过反编译后发现底层还是使用Iterator迭代器进行遍历
等等,这一章还没完,还有一个ListIterator。它继承 Iterator 接口,在遍历List集合时可以从任意索引下标开始遍历,而且支持双向遍历。
ListIterator 存在于 List 集合之中,通过调用方法可以返回起始下标为 index的迭代器
1 | List<Integer> list = new ArrayList<>(); |
ListIterator 中有几个重要方法,大多数方法与 Iterator 中定义的含义相同,但是比 Iterator 强大的地方是可以在任意一个下标位置返回该迭代器,且可以实现双向遍历。
1 | public interface ListIterator<E> extends Iterator<E> { |
4 ListIterator
简介
- ListIterator支持在元素列表上的所有CRUD操作(CREATE,READ,UPDATE和DELETE)。
- 与Iterator不同,ListIterator是bi-directional 。 它支持正向和反向迭代。
- 它没有当前元素; 它的光标位置始终位于通过调用previous()返回的元素和通过调用next()返回的元素之间。
实例
1 | ArrayList<String> list = new ArrayList<>(); |
主要方法
1 | void add(Object o) :将指定的元素插入列表(可选操作)。 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Estom的博客!










