1、迭代器Iterator在集合中的作用
迭代器是集合的专用遍历方式,它是依赖于集合而存在的,由集合对象调用 iterator() 方法而创建,常用于获取集合中的对象元素。
集合的获取功能:
- Iterator iterator():迭代器,集合的专用遍历方式
Object next():获取元素,并移动到下一个位置。
boolean hasNext():如果仍有元素可以迭代,则返回true。
集合的获取功能的使用通常都为以下步骤:
//A:创建集合
Collection c = new ArrayList();
//B:创建元素对象,这里以创建一个学生对象(name,age)为例
Student s = new Student("张三",21);
//C:把元素添加到集合
c.add(s);
//D:遍历集合,通常hasNext()辅助于next()使用
//通过集合获取Iterator对象
Iterator it = c.iterator(); //返回值类型是接口,实际上要的是它的实现类对象,实际返回的是new Itr();
//使用it遍历
while(it.hasNext()){
it.next(); //得到集合中的学生对象元素
}
2、迭代器为什么是一个接口,而不定义成一个具体的类?
假设迭代器定义的是一个类,这样我们就可以创建一个迭代器类的对象,调用该类的方法实现集合的遍历。但是,Java中提供了很多集合类,而这些集合类的数据结构是不同的,所以存储方式和遍历方式也是不同的,所以最终就没有定义集合类。
无论是哪一种集合,都应该具备获取元素的操作,并且最好是辅助于判断功能,这样,在获取前,先判断,这样就更不容易出错。也就是说,判断功能和获取功能应该是一个集合遍历所具备的。每一种集合的方式又不太一样,所以就把这两个功能给提取出来,并不提供具体实现,这种方式就是接口。
那么真正的具体实现类在哪里呢?在真正的具体子类类里,以内部类的方式体现。
3、迭代器的源码解析
public interface Iterator{ //Iterator是一个接口
public abstract boolean hasNext();
public abstract Object next();
}
public interface Iterable {
Iterator iterator();
//用于集合对象创建迭代器的方法,返回一个迭代器,Iterator是一个接口,所以要使用实现类实例化
}
public interface Collection extends Iterable { //继承自Iterable接口,所以可以调用iterator()方法
Iterator<E> iterator();
//在这接口Iterator的成员方法没有重写
}
public interface List extends Collection{
Iterator<E> iterator();
//在这里中,接口Iterator的成员方法依然没有重写
}
public class ArrayList implments List{
public Iterator<E> iterator() { //在这里,终于实现了
return new Itr();
}
//这里用了一个内部类实现了Iterator接口
private class Itr implements Iterator<E> {
public boolean hasNext(){...}//这里重写了hasNext()方法
public E next() {...} //这里重写了next()方法
}
}