参考答案:
假设迭代器定义的是一个类,这样我们就可以创建该类的对象,调用该类的方法来实现集合的遍历。但是,Java提供了很多的集合类,这些集合类的数据结构是不同的。所以,存储的方式和遍历的方式应该是不同的。进而它们的遍历方式也应该不是一样的。最终,就没有定义迭代器类。
而无论哪种集合,都应该具备获取元素的操作,而且,最好在辅助于判断功能,这样,在获取前,先判断,更不容易出错。也就是说,判断功能和获取功能应该是一个集合遍历所具备的,而每种集合的方式又不太一样,所以我们把这两个功能给提取出来,并不提供具体实现,这种方式就是接口。
那么真正的具体的实现类在哪里呢?
在真正的具体子类中,以内部类的方式体现的。
例如ArrayList类中的iterator()方法,ArrayList中的iterator()从父类中继承并重写,通过观察ArrayList源码
public Iterator iterator() {
return new Itr();
}
private class Itr implements Iterator {
int cursor;
// index of next element to return
int lastRet = -1;
// index of last element returned; -1 if no such
int expectedModCount = modCount;
public boolean hasNext() {
return cursor != size;
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
}
catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
可以看出ArrayList的iterator()方法,返回了一个实现了Iterator接口的Itr类对象,这个Itr被设计成ArrayList的内部类,重写了next()、hasNext()和remove()方法
public interface Inteator {
boolean hasNext();
Object next();
}
public interface Iterable {
Iterator iterator();
}
public interface Collection extends Iterable {
Iterator iterator();
}
public interface List extends Collection {
Iterator iterator();
}
public class ArrayList implements List {
public Iterator iterator() {
return new Itr();
}
private class Itr implements Iterator {
public boolean hasNext() {
}
public Object next() {
}
}
}
Collection c = new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
Iterator it = c.iterator();
//new Itr();
while(it.hasNext()) {
String s = (String)it.next();
System.out.println(s);
}