CS61B-6.3关于迭代器的实现

可能是因为继承理解得不够透彻,一碰到接口什么的我就感觉有点难接受

迭代器的引入

我们接着来介绍迭代器,实际上我们的集合类都是支持使用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();
}

通过使用迭代器,我们就可以实现对集合中的元素的进行遍历,就像我们遍历数组那样

它的运作机制大概是:

image-20221002150914323

一个新的迭代器就像上面这样,默认有一个指向集合中第一个元素的指针:

image-20221002151110991

迭代器的实现

以下是我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 "测试";
            }
        };
    }
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇