Collection接口下的集合迭代器遍历以及背后的工厂模式理解

60 阅读2分钟

迭代器遍历的实现

为了方便理解,我们把所有要用到的知识点罗列下来:

Collection接口:所有单列集合的祖宗接口,我们今天学习其三种通用遍历方式之一的迭代器遍历。

Collections类:接口+工具类设计,配合Collection接口下的集合使用。


Iterable接口:Collection接口的超接口。声明了iterator方法。
  • iterator方法:Iterator<T> iterator()返回一个在一组T类型元素上进行迭代的迭代器。

Iterator接口:声明了hasNext()方法,next方法。

  • hasNext方法:boolean hasNext()如果仍有元素可以迭代,返回true。

  • next方法:E next()返回迭代的下一个元素。

注意:接口中的方法都是抽象方法,想要实现需要重写!

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;

//迭代器遍历
public class Collection01 {
    public static void main(String[] args) {
        //向上转型,面向Collection接口创建ArrayList集合
        Collection<String> coll = new ArrayList<>();
    
        //利用Collections类的addAll静态方法添加元素
        Collections.addAll(coll, "aaa", "bbb", "ccc", "ddd");


        //面向Iterator接口创建迭代器对象it
        //调用ArrayList类中的iterator方法(重写Iterable接口中的抽象方法)见图一
        Iterator<String> it = coll.iterator();

        //利用实现了Iterator接口的内部类中的方法去迭代集合元素
        while(it.hasNext()) {
            String str = it.next();
            System.out.println(str);
        }
    }
}

ArrayList内部类迭代器.png

图一

在ArrayList类中,重写了iterator方法,返回一个内部类对象,该类实现了Iterator接口,重写了迭代器遍历用到的方法。

可能的疑问:接口不是不能实例化吗?为什么可以Iteratorr<String> it = coll.iterator();呢?

解答:用接口类型声明一个变量不等于实例化接口。


## 工厂模式的理解

工厂模式介绍:工厂指ArrayList类;工厂方法指iterator()方法,产品指Itr内部类。

仔细回想创建集合时,我故意用了向上转型,这是为了当问题变成其他集合类,相当于只是更换了工厂,内部都有自己对Iterator接口的实现。

所以coll.iterator()是一个标准的工厂模式的应用。


如果这篇文章起到作用,还请点赞收藏加关注😘