前面我们三篇文章来介绍集合接口的一些方法,这篇介绍剩下的一个方法iterator()。在Java中有一个Iterator的接口,这个单词的意思是迭代,其实迭代就是遍历的意思。我们知道集合是一个容器,是用来存储元素的,如果要查看元素,我们就需要遍历拿出来,这个遍历过程,由集合的iterator()方法提供。
1.iterator()
一个集合先有元素,然后使用了iterator()方法之后,返回的是一个Iterator的对象。然后通过Iterator接口下的hasNext()方法和next()方法来实现元素遍历输出。下面用一段代码来演示下。
package collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Demo1_Iterator {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("a");
c.add("b");
c.add("c");
c.add("d");
//对集合中的元素遍历(迭代)
Iterator it = c.iterator(); //获取迭代器
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
输出:
a
b
c
d
下面我们再来,迭代如何集合中是自定义对象的场景,还是需要借助前面的Student类,如果没有,请看前面文章的代码。
package collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Demo1_Iterator {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args) {
Collection c = new ArrayList();
c.add(new Student("张三", 23));
c.add(new Student("李四", 24));
c.add(new Student("王五", 25));
c.add(new Student("刘六", 26));
c.add(new Student("小七", 27));
//对集合中的元素遍历(迭代)
Iterator it = c.iterator(); //获取迭代器
while(it.hasNext()) {
Student s = (Student)it.next(); //向下转型
System.out.println(s.getName());
}
}
}
输出:
张三
李四
王五
刘六
小七
2.迭代器原理
迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样,那么就需要在每一个类中定义hasNext()和next()方法,这样做是可以的,但是会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部,定义自己迭代方式,这样做的好处有两点。第一是规定了整个集合体系的遍历方式都是hasNext()和next()方法,第二个好处是代码由底层内部实现,使用者不用管怎么实现的,会用就行。
所以,上面我们演示代码的hasNext()和next()方法,调用的都是ArrayList下面的重写的方法。可以在Eclipse上打开ArrayList,然后搜索hasNext()和next(),简单看看源码的实现过程。我们可以找到,在ArrayList下有一个Itr的类实现了Iterator接口,在Itr这个子类下重写了hasNext()和next(),以及remove()方法。