JDK源码解析之java.util.Iterator和java.lang.Iterable

在Java中,我们可以对List集合进行如下几种方式的遍历:第一种就是普通的for循环,第二种为迭代器遍历,第三种是for each循环。后面两种方式涉及到Java中的iterator和iterable对象,接下来我们通过源码来看看这两个对象的区别以及如何在自定义类中实现for each循环。

一、Java.util.Iterator

Java.util.Iterator 接口描述的是以统一的方式对各种集合元素进行遍历 / 迭代的工具,也称“迭代器”。

迭代器( Iterator )模式,又叫做游标( Cursor )模式,是用于遍历集合类的标准访问方法。 GOF 给出的定义为:提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。

package java.util;
import java.util.function.Consumer;public interface Iterator<E> {//如果迭代具有更多的元素,则返回true 
boolean hasNext();
//返回迭代中的下一个元素
E next();//从底层集合中删除此迭代器返回的最后一个元素
default void remove() {throw new UnsupportedOperationException("remove");
}
//对每个剩余元素执行给定的操作,直到所有元素都被处理或动作引发异常
default void forEachRemaining(Consumer<? super E> action) {Objects.requireNonNull(action);while (hasNext())action.accept(next());
}
}

iterator通过hasNext()next()两个方法定义了对集合迭代访问的方法,而具体的实现方式依赖于不同的实现类,具体的集合类实现Iterator接口中的方法以实现迭代。

二、java.lang.Iterable

Iterable是从jdk1.5就存在的接口,其实我们经常用到它的功能,就是for-each,要想使用for-each,就必须实现此接口

package java.lang;import java.util.Iterator;
import java.util.Objects;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.Consumer;//实现此接口允许对象成为“for-each loop”语句的目标
public interface Iterable<T> {
//返回类型为 T元素的迭代器。	since 1.5
Iterator<T> iterator();
//对迭代器中的所有的元素进行某项处理,直到所有的都被处理或者出现异常	since 1.8
default void forEach(Consumer<? super T> action) {Objects.requireNonNull(action);for (T t : this) {action.accept(t);}
}
/*返回一个可分割的迭代器	since 1.8Spliterator,可分割的迭代器,是1.8退出的用于并行遍历元素而设计的一个迭代器官方文档说明默认的实现分割的能力比较差,推荐覆盖默认实现。可以跟上面的Iterator功能区分;一个是顺序遍历,一个是并行遍历
*/
default Spliterator<T> spliterator() {return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}

在List中并没有实现Iterator接口,而是实现的Iterable接口。观察Iterable接口的源码可以发现其只是返回了一个Iterator对象。

注意

  1. 并不是实现了Iterable接口的类才能使用foreach遍历,数组就没有实现Iterable接口,数组使用foreach,反编译后的代码其实是通过for循环来完成这个遍历的功能。
  2. 1.8新增了两个默认实现:一个是foreach,一个是Spliterator
  3. foreachSpliterator一个是顺序遍历元素,一个是并行遍历元素

三、迭代器原理

java 集合类库的迭代器跟其他类库的迭代器在概念上有着重要的区别。比如:C++的标准模板库的迭代器是根据数组索引建模的。如果给定这样一个迭代器,就可以查看指定位置上的元素,就像是知道数组索引i,就可以查看数组元素a[i]一样,不需要查找元素,就可以将迭代器向前移动一个位置。但是Java迭代器并不是如此。

1544952542193

java迭代器查找操作和位置变更是紧密相连的,查找元素的唯一方式就是调用next,而在执行查找的同时,迭代器位置随之向前移动,因此,应该将java迭代器 认为是位于两个元素之间。当调用next时候,迭代器就越过下一个元素,并返回刚刚越过的那个元素的引用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535646.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为了让你的网页能在更多的服务器上正常地显示,还是加上“SET NAMES UTF8”吧

Repinted:http://blog.csdn.net/class1/archive/2006/12/30/1469298.aspx 为了让你的网页能在更多的服务器上正常地显示&#xff0c;还是加上“SET NAMES UTF8”吧(可以根据你的喜欢选择相应的编码,如gb2312)&#xff0c;即使你现在没有加上这句也能正常访问。 先说MySQL的字…

WebLogic11g 安装配置规范

目录 1 文档控制... 3 1.1 修改记录... 3 1.2 分发者... 3 1.3 审阅记录... 3 1.4 相关文档... 3 2 安装准备... 4 2.1 安装前需要开发单位提供的信息... 4 2.2 本地磁盘空间配置规范... 4 2.3 版本要求规范... 4 2.4 weblogic部署配置规范... 5 2.4.1操作系统要求.…

JDK源码解析之java.util.ListIterator

ListIterator是一个功能更加强大的迭代器接口, 它继承于Iterator接口,只能用于各种List类型的访问。可以通过调用listIterator()方法产生一个指向List开始处的ListIterator, 还可以调用listIterator(n)方法创建一个一开始就指向列表索引为n的元素处的ListIterator。 一、源码解…

VsFTP出现500 OOPS: cannot change directory的解决办法

cannot change directory:/home/*** ftp服务器连接失败,错误提示:500 OOPS: cannot change directory:/home/*******500 OOPS: child died解决方法:在终端输入命令&#xff1a;setsebool ftpd_disable_trans 1 service vsftpd restart就&#xff2f;&#xff2b;了&#xff01;…

Oracle的reman命令

list命令&#xff1a; list backupset summary 列出概要信息 list backupset by file list archivelog all 列出所有归档日志 list backupset tag 00列出标签信息 list backupset 8 列出8号…

Ubuntu root账号的使用

第一次安装好Ubuntu后&#xff0c;root帐号不能用。在安装期间创建的第一个用户对系统有管理权&#xff0c;通过“sudo”能象root运行程序.使用时仅需它的普通用户密码。例如: sudo apt-get update  如果你希望像传统 UNIX 样式使用root帐号。你能通过输入 sudo passwd root …

JDK源码解析之Java.util.Collection

Collection是单例集合的顶层接口&#xff0c;它表示一组对象&#xff0c;这些对象也称为Collection的元素&#xff0c;JDK 不提供此接口的任何直接实现&#xff0c;它提供更具体的子接口&#xff08;如Set和List&#xff09;实现 一、源码解析 1、接口定义 public interface …

Vim 命令操作

vim命令操作命令模式dd 编辑模式 末行模式 1.地址定界&#xff1a; startpos,endpos #:特定的第#行&#xff0c;例如S即第5行;:当前行;$:最后一行; #,#:指定行范圃,左侧起始行&#xff0…

JDK源码解析之Java.util.Collections

java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化&#xff0c;就像一个工具类,服务于Java的Collection框架。 一、源码解析 1、不可实例化 private Collections() {}Collections是util包中一个不可实例化的类。 2、优化参数 pri…

ubuntu下安装jdk

安装1.5 sudo apt-get install sun-java5-jdk sudo update-alternatives --config java sudo update-alternatives --config javac 安装1.6 sudo apt-get install sun-java6-jdk sudo update-alternatives --config java sudo update-alternatives --config javac 转载:http:/…

使用validate验证数据库

验证数据备份集是不是可以用来做恢复和数据文件是否损坏、坏块 三种方式&#xff1a; 1.validate validate database ;validate tablespace users; validate datafile 1; validate archivelog all validate datafile 1 block 10; validate backupset 28; db…

JDK源码解析之java.util.AbstractCollection

AbstractCollection类提供了collection的实现类应该具有的基本方法&#xff0c;具有一定的普适性&#xff0c;可以从大局上了解collection实现类的主要功能。 java.util.AbstractCollection这个类提供了对接口Collection骨骼级的实现。 一、源码解析 1、iterator():返回一个迭…

沟通linux与windows的wine

据Netcraft网站调查&#xff0c;现在互联网上的主机有75&#xff05;以上采用Linux作为操作系统。作为服务器操作系统&#xff0c;Linux已经站稳了脚步&#xff0c;可是在桌面 操作系统上&#xff0c;还是微软的“瘟到死”一支独秀。这倒不是说Linux不好&#xff0c;很大原因我…

备份spfil、控制文件等

delete backup&#xff1b; delete backupset delete noprompt backup backup keep forver database 永久保存恢复目录中支持此命令 show parameter control 备份spfile backup spfile backup current contrlfile configure controlfile autoback …

日常问题——阿里云服务器ssh经常一段时间就断掉解决办法

#vim /etc/ssh/sshd_config 找到下面两行 #ClientAliveInterval 0 #ClientAliveCountMax 3 去掉注释&#xff0c;改成 ClientAliveInterval 30 ClientAliveCountMax 86400 这两行的意思分别是 1、客户端每隔多少秒向服务发送一个心跳数据 2、客户端多少秒没有相应&#…

在Ubuntu 8.04 LTS(hardy)下安装配置nginx和fastcgi方式的php

最近我们(瑞豪开源Xen VPS: http://www.RasHost.com)的一个客户要求在他的Ubuntu 8.04 VPS上安装一个高性能的nginx&#xff0c;下面是我的安装记录。 由于Ubuntu 804已经包含了nginx&#xff0c;所以根本不要编译&#xff0c;安装超简单&#xff01; 在VPS上修改/etc/apt/so…

apt-get包管理详解

apt-get使用source.list文件进行软件包管理。如果您想了解关于如何编辑和更新source.list中的条目的信息&#xff0c;请参阅SourcesList“起初GNU/Linux系统中只有.tar.gz。用户必须自己编译他们想使用的每一个程序。在Debian出现之後&#xff0c;人们认为有必要在系统中添 加一…

awk命令

awk是一个强大的文本分析工具&#xff0c;相对于grep的查找&#xff0c;sed的编辑&#xff0c;awk在其对数据分析并生成报告时&#xff0c;显得尤为强大。简单来说awk就是把文件逐行的读入&#xff0c;以空格为默认分隔符将每行切片&#xff0c;切开的部分再进行各种分析处理。…

ubuntu安装字符集

sudo locale-gen zh_CN.GBK sudo locale-gen zh_CN

正则表达式和grep

正则表达式(regular expression, RE)是一种字符模式&#xff0c;用于在查找过程中匹配指定的字符。 在大多数程序里&#xff0c;正则表达式都被置于两个正斜杠之间;例如/lv[o0]e/就是由正斜杠界定的正则表达式&#xff0c;它将匹配被查找的行中任何位置出现的相同模式。在正则表…