阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

使用Iterator

243次阅读
没有评论

共计 1996 个字符,预计需要花费 5 分钟才能阅读完成。

Java 的集合类都可以使用 for each 循环,ListSetQueue 会迭代每个元素,Map会迭代每个 key。以 List 为例:

List<String> list = List.of("Apple", "Orange", "Pear");
for (String s : list) {System.out.println(s);
}

实际上,Java 编译器并不知道如何遍历 List。上述代码能够编译通过,只是因为编译器把for each 循环通过 Iterator 改写为了普通的 for 循环:

for (Iterator<String> it = list.iterator(); it.hasNext();) {String s = it.next();
     System.out.println(s);
}

我们把这种通过 Iterator 对象遍历集合的模式称为迭代器。

使用迭代器的好处在于,调用方总是以统一的方式遍历各种集合类型,而不必关心它们内部的存储结构。

例如,我们虽然知道 ArrayList 在内部是以数组形式存储元素,并且,它还提供了 get(int) 方法。虽然我们可以用 for 循环遍历:

for (int i=0; i<list.size(); i++) {Object value = list.get(i);
}

但是这样一来,调用方就必须知道集合的内部存储结构。并且,如果把 ArrayList 换成 LinkedListget(int) 方法耗时会随着 index 的增加而增加。如果把 ArrayList 换成 Set,上述代码就无法编译,因为Set 内部没有索引。

Iterator 遍历就没有上述问题,因为 Iterator 对象是集合对象自己在内部创建的,它自己知道如何高效遍历内部的数据集合,调用方则获得了统一的代码,编译器才能把标准的 for each 循环自动转换为 Iterator 遍历。

如果我们自己编写了一个集合类,想要使用 for each 循环,只需满足以下条件:

  • 集合类实现 Iterable 接口,该接口要求返回一个 Iterator 对象;
  • Iterator 对象迭代集合内部数据。

这里的关键在于,集合类通过调用 iterator() 方法,返回一个 Iterator 对象,这个对象必须自己知道如何遍历该集合。

一个简单的 Iterator 示例如下,它总是以倒序遍历集合:

// Iterator
import java.util.*;

public class Main {public static void main(String[] args) {ReverseList<String> rlist = new ReverseList<>();
        rlist.add("Apple");
        rlist.add("Orange");
        rlist.add("Pear");
        for (String s : rlist) {System.out.println(s);
        }
    }
}

class ReverseList<T> implements Iterable<T> {private List<T> list = new ArrayList<>();

    public void add(T t) {list.add(t);
    }

    @Override
    public Iterator<T> iterator() {return new ReverseIterator(list.size());
    }

    class ReverseIterator implements Iterator<T> {int index;

        ReverseIterator(int index) {this.index = index;
        }

        @Override
        public boolean hasNext() {return index > 0;
        }

        @Override
        public T next() {
            index--;
            return ReverseList.this.list.get(index);
        }
    }
}

虽然 ReverseListReverseIterator的实现类稍微比较复杂,但是,注意到这是底层集合库,只需编写一次。而调用方则完全按 for each 循环编写代码,根本不需要知道集合内部的存储逻辑和遍历逻辑。

在编写 Iterator 的时候,我们通常可以用一个内部类来实现 Iterator 接口,这个内部类可以直接访问对应的外部类的所有字段和方法。例如,上述代码中,内部类 ReverseIterator 可以用 ReverseList.this 获得当前外部类的 this 引用,然后,通过这个 this 引用就可以访问 ReverseList 的所有字段和方法。

小结

Iterator是一种抽象的数据访问模型。使用 Iterator 模式进行迭代的好处有:

  • 对任何集合都采用同一种访问模型;
  • 调用者对集合内部结构一无所知;
  • 集合类返回的 Iterator 对象知道如何迭代。

Java 提供了标准的迭代器模型,即集合类实现 java.util.Iterable 接口,返回 java.util.Iterator 实例。

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-08-05发表,共计1996字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7987239
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
如何安装2026年最强个人助理ClawdBot、完整安装教程

如何安装2026年最强个人助理ClawdBot、完整安装教程

如何安装 2026 年最强个人助理 ClawdBot、完整安装教程 一、前言 学不完,根本学不完!近期,一款名...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞...
4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

  4 盘位、4K 输出、J3455、遥控,NAS 硬件入门性价比之王 开篇 在 NAS 市场中,威...
免费领取huggingface的2核16G云服务器,超简单教程

免费领取huggingface的2核16G云服务器,超简单教程

免费领取 huggingface 的 2 核 16G 云服务器,超简单教程 前言 HuggingFace.co...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个 AI 智能体 — 跟创业大佬对话 前言 智能体(Agent)已经成为创业者和技术人绕...
开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

  开源 MoneyPrinterTurbo 利用 AI 大模型,一键生成高清短视频! 在短视频内容...
Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集 在云原生体系中,Prometheus 已成为最主流的监控与报警...
让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级 大家好,我是星哥,之前写了一篇文章 自己手撸一...
星哥带你玩飞牛NAS硬件03:五盘位+N5105+双网口的成品NAS值得入手吗

星哥带你玩飞牛NAS硬件03:五盘位+N5105+双网口的成品NAS值得入手吗

星哥带你玩飞牛 NAS 硬件 03:五盘位 +N5105+ 双网口的成品 NAS 值得入手吗 前言 大家好,我...