概述
Java中的Iterable与Iterator详解
一、java集合的遍历方式
针对集合的遍历,有很多种方式,下面主要演示List集合的遍历方式。
List list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
1,传统的for循环
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
2,提升效率的传统的for循环
for (int i = 0, size = list.size(); i < size; i++) {
System.out.println(list.get(i));
}
3,增强for循环
for (String s : list) {
System.out.println(s);
}
4,java8 的forEach循环
list.forEach(System.out::println);
5,迭代器循环
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
二、迭代器循环详解
我们知道集合接口实现了 Iterable 接口
public interface Collection extends Iterable {}
其中Iterable接口的代码如下(去除了默认的方法):
public interface Iterable {
Iterator iterator();
}
这里有一个 iterator方法,返回一个Iterator接口:
public interface Iterator {
boolean hasNext();
E next();
}
该接口有两个方法,判断下一个对象是否存在,其次读取该对象。
Iterable接口:从继承结构中可以看出,Iterable接口是Collection的顶层接口,所以Iterable是数据结构,用来存放数据的地方。所有实现了该接口的类表明该类是可以被遍历的。Iterable是可以迭代的一系列元素的表示。它没有任何迭代状态,例如“当前元素”。相反,它有一个生成迭代器的方法。
Iterator接口:是定义了迭代逻辑的接口,即:用于遍历Collection(集合类)中数据的标准访问方法。迭代器是具有迭代状态的对象。它允许你使用hasNext检查它是否有更多元素,并使用next移动到下一个元素(如果有)。
为什么一定要实现Iterable接口,为什么不直接实现Iterator接口呢?
有一个问题,为什么不直接将hasNext(),next()方法放在Iterable接口中,其他类直接实现就可以了?
因为Iterator接口的核心方法next()或者hasNext()是依赖于迭代器的当前迭代位置的。如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。但即时这样,Collection也只能同时存在一个当前迭代位置。而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。多个迭代器是互不干扰的。
有些集合类可能不止一种遍历方式,实现了Iterable的类可以再实现多个Iterator内部类,例如LinkedList中的ListItr和DescendingIterator两个内部类,就分别实现了双向遍历和逆序遍历。通过返回不同的Iterator实现不同的遍历方式,这样更加灵活。如果把两个接口合并,就没法返回不同的Iterator实现类了。这说明如果某个接口的方法在同一个实现类中可能有多种实现的话,使用这种方式则十分符合。使用时需要创建内部类的方式。
最后
以上就是超级小鸽子为你收集整理的java for iterator_Java中的Iterable与Iterator详解的全部内容,希望文章能够帮你解决java for iterator_Java中的Iterable与Iterator详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复