惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
WordPress大学
WordPress大学
Help Net Security
Help Net Security
Jina AI
Jina AI
Security Latest
Security Latest
Y
Y Combinator Blog
Project Zero
Project Zero
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
GbyAI
GbyAI
Know Your Adversary
Know Your Adversary
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
NISL@THU
NISL@THU
Cisco Talos Blog
Cisco Talos Blog
博客园 - 司徒正美
MyScale Blog
MyScale Blog
Cyberwarzone
Cyberwarzone
D
Docker
T
The Blog of Author Tim Ferriss
G
Google Developers Blog
C
CERT Recently Published Vulnerability Notes
B
Blog
L
LangChain Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
SecWiki News
SecWiki News
The Hacker News
The Hacker News
C
Check Point Blog
L
Lohrmann on Cybersecurity
V2EX - 技术
V2EX - 技术
S
Securelist
T
Threat Research - Cisco Blogs
Stack Overflow Blog
Stack Overflow Blog
TaoSecurity Blog
TaoSecurity Blog
云风的 BLOG
云风的 BLOG
Latest news
Latest news
人人都是产品经理
人人都是产品经理
L
LINUX DO - 最新话题
Application and Cybersecurity Blog
Application and Cybersecurity Blog
The Register - Security
The Register - Security
Webroot Blog
Webroot Blog
Simon Willison's Weblog
Simon Willison's Weblog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Microsoft Security Blog
Microsoft Security Blog
AWS News Blog
AWS News Blog
C
Cybersecurity and Infrastructure Security Agency CISA
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
小众软件
小众软件
T
Tailwind CSS Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
宝玉的分享
宝玉的分享
O
OpenAI News

技术改变视野

为程序员、设计师打造的摸鱼社区:摸鱼派! - 技术改变视野 大白话 | Java初学指♂男:“说说初学的误区与死结”( 壹 | 反射与Field ) - 技术改变视野 大白话之耦合性:什么是耦合性和内聚性?用编程语言实例讲解! - 技术改变视野 🎨 适用于 Solo / Bolo 的清新高级主题 —— Sakura | 移植自 WordPress 主题 - 技术改变视野 我在 GitHub 上的开源项目 - 技术改变视野 为IDEA/Git配置GPG密钥,点亮GitHub Verified Commit标识 - 技术改变视野 从 SpringMVC 转为使用 SpringBoot —— 手把手带你使用 Intellij IDEA 最快速地搭建 SpringBoot+MyBatis(无 XML)+Thymeleaf - 技术改变视野 无题 - 技术改变视野 年轻人的第一辆京牌电动车 - 技术改变视野 我们忙碌且漫长的一生,有多久是为自己而活? - 技术改变视野 一个最简单的实例理解Semaphore在Java中的作用 - 技术改变视野 说说《后浪》 - 技术改变视野 离线使用 Google Fonts:让你的网站更精致 | goofoffline 神器,一键下载生成离线字体库! - 技术改变视野 实例带你学会简单的Java Thread多线程 - 技术改变视野 一个实例理解Java的接口(interface)用处与用法 - 技术改变视野 一个实例带你理解JavaBean - 技术改变视野 WebFilter-SpringBoot过滤器注解实例讲解 - 技术改变视野 实例带你搞懂Java多线程&&线程池之(壹):线程池与多线程的关系和区别 - 技术改变视野 实例带你搞懂Java多线程&&线程池之(贰):简单的线程池应用 - 技术改变视野 实例带你获取多线程Thread的返回值之 (壹) - Callable的运行 - 技术改变视野 实例带你获取多线程Thread的返回值之 (贰) - Callable配合线程池返回数据 - 技术改变视野 一个实例理解Java Runnable多线程用处与用法 - 技术改变视野 从零开始OpenSSL之 (壹) - 使用genrsa、rsa、rsautl生成公私钥 - 技术改变视野 从零开始 OpenSSL 之 (贰) - 使用 rsautl 解密文件 - 技术改变视野 大白话之Docker(壹):快速入门&&简单官方实例 - 技术改变视野 大白话之Docker(贰):简单部署一个Tomcat服务并发布内容 - 技术改变视野 大白话之从零讲解DVWA(壹)-SQL注入(SQL Injection) Low Level - 技术改变视野 大白话之从零讲解DVWA(贰)-SQL注入(SQL Injection) Medium/High Level - 技术改变视野 Java日志插件-Slog4J下载 - 技术改变视野 大白话之必会Java Atomic | 线程一点也不安全(一):比自增和synchronized更快速、靠谱的原子操作(调用C语言) - 技术改变视野 Log-MySQL root用户登录后无法查看数据库全部表/正常访问数据库 Access denied for user 'root'@'localhost' to database - 技术改变视野 大白话之Docker(叁):制作一个运行Tomcat服务端的Docker镜像 - 技术改变视野 Github仅保留指定文件/文件夹当前Commit,删除所有历史记录,清除「敏感信息」 - 技术改变视野 将Tomcat、MySQL从Linux迁移到Windows的心路历程(干货):令人恐惧的字符编码 - 技术改变视野 Spring: java.lang.NoSuchMethodError: clearCache | ClassNotFoundException | Error during artifact deployment 思路及解决办法 - 技术改变视野 大白话之Java反射-初学最迷的概念:能干啥?咋用? - 技术改变视野 大白话之Java面向接口编程:最“正经”的中文实例讲解,看不懂来打我! - 技术改变视野 大白话之fail-fast | fail-safe:为什么会有这个机制?它有什么作用? - 技术改变视野 刨根问底 | 大白话:在使用注解后,框架是怎么知道你哪个方法使用了注解的?用@RequestMapping注解举例详解! - 技术改变视野 大白话之必会Java Atomic | 线程一点也不安全(二):Atomic的ABA问题会导致什么情况?如何解决? - 技术改变视野 随笔 | 奇淫技巧 | Java:记return和短路运算符的妙用 - 技术改变视野 随笔 | Tomcat:续-从Linux迁移到Windows编码问题彻底解决 - 技术改变视野 大白话之AutoClosable接口 | try-with-resources:JDK1.7的新特性,提高重复回收效率 - 技术改变视野 大白话之Java多线程join方法:开局一张图,试学一分钟,你就费和我一样,理解介个方法 - 技术改变视野 大白话之Java Stream流:将类数组流化,便捷批量修改,通俗讲解! - 技术改变视野 Java 困扰三周の问题:使用byte[]或skip()方法读取字节流Stream文件尾部多/少/缺字节解决方法 - 技术改变视野 大白话之Java级联调用:一个类,一条语句,同时调用好几个方法,串成一串 - 技术改变视野
大白话 | 课堂实践:使用Iterator对数组进行遍历 - 技术改变视野
adlered · 2019-12-09 · via 技术改变视野

前言

阅读本篇文章,你需要对以下知识有所了解:

  • 接口(这儿有
  • Iterator的使用
  • Java 匿名内部类

构思

我们都知道,Iterator是一种迭代器,它的接口中有四种方法(JDK 1.8):

1public interface Iterator<E> {
2	boolean hasNext();
3	E next();
4	default void remove() { throw new UnsupportedOperationException("remove"); }
5        default void forEachRemaining(Consumer<? super E> action) { Objects.requireNonNull(action);while (hasNext()) action.accept(next()); }
6}
方法 返回值 作用
hasNext() boolean 查找是否还有下一个元素,如果有,返回true,反则返回false
next() Object 返回下一个元素
remove() void 删除当前指向的元素
forEachRemaining(Consumer<? super E> action) void 对剩余的元素进行循环处理。传入一个Consumer参数,用于针对每个元素会执行的方法

现在创建一个数组:

1//创建数组
2String[] elements = {"苟利国家", "生死以,", "\n", "岂因祸福", "避趋之。"};

Q: 如果我们想利用Iterator遍历这个数组,主要需要调用Iterator的哪个方法?

A: hasNext()用于查询是否还有下个元素、next()用于返回下个元素。

实现

Iterator迭代器是一个接口,所以接口中的hasNext()方法和next()方法是实现接口后必须重写的方法。
本行选读,可以不理解remove()方法和forEachRemaining(Consumer<? super E> action)方法使用了default方法标记,说明它是有默认方法的,所以我们并不是必须要重写。

好,是时候打开你的IDE了:新建个项目,然后我们继续。

新建类

先别急着腿软,我们稍后会剖析整个过程。
占用你一分钟的时间,让我们新建两个类:

Main.java

 1import java.util.Iterator;
 2
 3public class Main {
 4    public static void main(String[] args) {
 5        //创建数组
 6        String[] elements = {"苟利国家", "生死以,", "\n", "岂因祸福", "避趋之。"};
 7        //实例化Itr类,并将创建的数组传入
 8        Itr itr = new Itr(elements);
 9        //调用itr.iterator匿名内部类,并赋值到iterator
10        Iterator iterator = itr.iterator();
11        /**
12         * 当iterator.hasNext()返回值为false时,while循环有效
13         * 使用iterator.next()方法,返回下一个元素
14         */
15        while (iterator.hasNext()) {
16            System.out.print(iterator.next());
17        }
18    }
19}

Itr.java

 1import java.util.Iterator;
 2
 3public class Itr implements Iterable {
 4    private String[] elements;
 5
 6    /**
 7     * 默认方法,用于实例化本类时传入指定数组
 8     *
 9     * @param elements 数组
10     */
11    Itr(String[] elements) {
12        this.elements = elements;
13    }
14
15    public Iterator iterator() {
16        return new Iterator() {
17            //指针,记录当前指示的数组下标
18            private Integer cursor = -1;
19
20            @Override
21            public boolean hasNext() {
22                /**
23                 * 假设:当前cursor值为2,将cursor + 1 = 3
24                 * 要判断elements的下标3位置是否为空,取elements的长度3并减1得2,证明elements的元素最多到2
25                 * 判断:( cursor + 1 ) = 3 <= ( elements.length - 1 ) = ( 3 - 1 ) = 2
26                 * 由于 3 !<= 2,所以返回false,即没有下一个元素
27                 */
28                return cursor + 1 <= elements.length - 1;
29            }
30
31            @Override
32            public Object next() {
33                /**
34                 * ++cursor为自增运算符,将cursor的值+1,将目标下标的元素返回
35                 */
36                return elements[++cursor];
37            }
38        };
39    }
40
41}

现在运行主方法,你会得到运行结果:

1苟利国家生死以,
2岂因祸福避趋之。

剖析

扔下一个我刚刚画好的思维导图:

7.png

太长也得看。用这个思维导图配合代码中的注释,你一定能理解Iterator接口的编写和使用。

后语

Iterator是迭代器,而enumeration是枚举。
Iterator支持fail-fast机制,而Enumeration不支持。
fast-fail机制能确保迭代过程的线程安全:一个线程在进行迭代时,其它线程无法访问该类(抛出ConcurrentModificationException异常)。
更多关于fast-fail机制的知识,请点击这里