本文最后更新于 92 天前,其中的信息可能已经有所发展或是发生改变。
可能是因为继承理解得不够透彻,一碰到接口什么的我就感觉有点难接受
迭代器的引入
我们接着来介绍迭代器,实际上我们的集合类都是支持使用foreach
语法的:
public static void main(String[] args) {
List<String> list = Arrays.asList("A", "B", "C");
for (String s : list) { //集合类同样支持这种语法
System.out.println(s);
}
}
但是由于仅仅是语法糖,实际上编译之后:
public static void main(String[] args) {
List<String> list = Arrays.asList("A", "B", "C");
Iterator var2 = list.iterator(); //这里使用的是List的迭代器在进行遍历操作
while(var2.hasNext()) {
String s = (String)var2.next();
System.out.println(s);
}
}
那么这个迭代器是一个什么东西呢?我们来研究一下:
public static void main(String[] args) {
List<String> list = Arrays.asList("A", "B", "C");
//通过调用iterator方法快速获取当前集合的迭代器
//Iterator迭代器本身也是一个接口,由具体的集合实现类来根据情况实现
Iterator<String> iterator = list.iterator();
}
通过使用迭代器,我们就可以实现对集合中的元素的进行遍历,就像我们遍历数组那样
它的运作机制大概是:
一个新的迭代器就像上面这样,默认有一个指向集合中第一个元素的指针:
迭代器的实现
以下是我proj1中的ArrayDeque的迭代器实现
首先要在类中实现接口
public class ArrayDeque<T> implements Deque<T>, Iterable<T>
因为我们的ArrayDeque类实现了Iterable接口,所以当然要在类中实现抽象方法
@Override
public Iterator<T> iterator() {
return new ArrayIterator();
}
但是这里为什么要返回一个我们刚new的对象呢?
这是什么意思?
这种做法是为了使得每次调用
iterator()
方法时都能够返回一个新的迭代器对象,以确保迭代器的状态是独立的,不会受到外部因素的影响。这是一种常见的设计模式,称为“工厂模式”或“抽象工厂模式”,其中的工厂方法(如iterator()
)负责创建对象实例。
private class ArrayIterator implements Iterator<T> {
int index;
public ArrayIterator(){
index = 0;
}
@Override
public boolean hasNext() {
return index < size;
}
@Override
public T next() {
T returnElem = array[index];
index += 1;
return returnElem;
}
}
ArrayIterator则是实现了Itrerator的抽象方法,我们在这里指定具体的规则
我们也可以通过匿名内部类来实现接口
public class Test implements Iterable<String>{ //这里我们随便写一个类,让其实现Iterable接口
@Override
public Iterator<String> iterator() {
return new Iterator<String>() { //生成一个匿名的Iterator对象
@Override
public boolean hasNext() { //这里随便写的,直接返回true,这将会导致无限循环
return true;
}
@Override
public String next() { //每次就直接返回一个字符串吧
return "测试";
}
};
}
}