有时候我们要遍历容器,但是不同的容器的遍历方法是不一样的,所以我们得进一步遍历Interface,抽象出一个Iterator接口,来向用户屏蔽底层遍历的细节。
1.首先定义一个Iterator接口:
public interface Iterator {
Object next(); //下一个数据节点
boolean hasNext(); //是否有下一个
}
2.在Collection中使用Iterator这个接口:
public interface Collection {
void add(Object o); //添加
int size(); //容器长度
<strong><span style="color:#ff0000;">Iterator iterator(); //容器对象</span></strong>
}
3.则ArrayList和LinkedList中就会实现这个iterator()方法:
以ArrayList为例:
public Iterator iterator() {
return new ArrayListIterator(); //返回内部对象
}
private class ArrayListIterator implements Iterator { //内部类来屏蔽ArrayList内部的遍历
private int currentIndex = 0;
@Override
public boolean hasNext() {
if(currentIndex >= index) return false;
else return true;
}
@Override
public Object next() {
Object o = objects[currentIndex];
currentIndex ++;
return o;
}
}
以LinkedList为例:
public Iterator iterator() {
// TODO Auto-generated method stub
return new LinkedListIterator();
}
private class LinkedListIterator implements Iterator {
private int currentIndex = 0;
//private Node temp;
@Override
public boolean hasNext() {
if(currentIndex >= size) return false;
else return true;
}
@Override
public Object next() {
Object o = head.getData();
head=head.getNext();
currentIndex ++;
return o;
}
}
4.则在test.java中想对容器进行遍历的时候就可以如下操作:
Iterator it = c.iterator();
while(it.hasNext()) {
Object o = it.next();
System.out.print(o + " ");
}
5.ok这样用户只需要得到iterator就可以了,不用关心它用的是什么容器。