1、迭代器的感性认识

  对于Collection类下的集合如各种List各种Set,用于实现这些集合的数据结构各不相同,比如数组实现的ArrayList、链表实现的LinkedList,当客户端知道要使用的集合的底层结构的时候可以选择相应的遍历方式。

  比如客户端知道ArrayList是用数组实现的,可以使用遍历数组的方式遍历ArrayList。如果客户端需要遍历的容器类型发生了变换可能就不能或者不适合使用先前的遍历方式,比如如果把ArrayList换成LinkedList,虽然仍然可以使用这种方式遍历但性能大大降低;如果换成某个set,甚至不能使用这种方式遍历。

     ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3); for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}

  为了提高代码的通用性减小耦合性,在客户端和容器之间新增了一个新的角色:迭代器,迭代器负责屏蔽了各种Collection实现类的区别,采用同样的迭代器语法可以遍历Collection的所有子类,这样以来客户端的代码无需关心集合类的具体实现。

        Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
} Iterator<Integer> linkIterator = list2.iterator();
while (linkIterator.hasNext()){
System.out.println(linkIterator.next());
} Iterator<Integer> setIterator = set.iterator();
while (setIterator.hasNext()){
System.out.println(setIterator.next());
}

  迭代器往小了说是一种遍历集合的方式,往大了说他也是一种设计模式。

2、源码

  可以猜出迭代器应该是某种接口,而且是应该靠近Collection继承体系顶层的接口,因为Collection集合下的所有类是通用的。

public interface Iterable<T> {

    Iterator<T> iterator();

    default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
} default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}

  iterable接口中第一个方法用来返回iterator对象,二者的名字很像。从英语语法的角度分析iterable是一个形容词代表实现了该接口的对象有可迭代的能力,iterator是一个名词是具体迭代的执行者又称迭代器。实现了iterable接口的集合对象通过返回的iterator实现了对该集合的迭代。剩下两个方法的jdk-1.8中新增的,它们使用default关键字修饰。default关键字允许在接口中定义方法,且不要求实现了该接口的类实现该方法。  

package java.util;

import java.util.function.Consumer;

/**
public interface Iterator<E> { 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用于取出下一个元素;剩下的两个default修饰的方法是jdk-1.8新增的。

iterable与iterator的更多相关文章

  1. Java中的Iterable与Iterator详解

    在Java中,我们可以对List集合进行如下几种方式的遍历: List<Integer> list = new ArrayList<>(); list.add(5); list ...

  2. java学习--Iterable 和 Iterator

    Iterable Iterable :故名思议,实现了这个接口的集合对象支持迭代,是可迭代的. 一个集合对象要表明自己支持迭代,能有使用foreach语句的特权,就必须实现Iterable接口,表明我 ...

  3. java 中的 Comparable 和 Comparator 与 Iterable 和 Iterator

    Comparable 和 Comparator Comparable 和 Comparator 是两个关系不大的类,其分别侧重于不同的方面. 其中,接口 Comparable<T> 强行对 ...

  4. 聊一聊Iterable与Iterator的那些事!

    前言 欢迎关注公众号:Coder编程 获取最新原创技术文章和相关免费学习资料,随时随地学习技术知识! 在上一篇文章通过面试题,让我们来了解Collection,我们会发现Collection接口之上还 ...

  5. Python学习之路day4-列表生成式、生成器、Iterable和Iterator

    一.列表生成式 顾名思义,列表生成式就是用于生成列表的特殊语法形式的表达式. 1.1 语法格式 [exp for iter_var in iterable] 工作过程: 1.通过iter_var迭代i ...

  6. Python:Iterable和Iterator

    转于:https://blog.csdn.net/whgqgq/article/details/63685066 博主:gongqi1992 iterable和iterator最基本的区别: iter ...

  7. Java中的Enumeration、Iterable和Iterator接口详解

    前言 在看各类Java书籍或者博文的时候,总是会遇到Enumeration.Iterable和Iterator这三个接口,如果对这几个接口不是很明白的话,总会让自己看着看着就迷惑了,正好这周末,抽空把 ...

  8. Java基础之Iterable与Iterator

    Java基础之Iterable与Iterator 一.前言: Iterable :故名思议,实现了这个接口的集合对象支持迭代,是可迭代的.able结尾的表示 能...样,可以做.... Iterato ...

  9. Java集合【4】-- iterable和Iterator的异同分析详解

    目录 一.iterator介绍 二.iterable接口 三.为什么有Iterator还需要Iterable 一.iterator介绍 iterator接口,也是集合大家庭中的一员.和其他的Map和C ...

随机推荐

  1. ChartControl ViewType.Pie3D 用法测试

    效果图一. public partial class Form3 : Form { public Form3() { InitializeComponent(); } private void For ...

  2. 16.Odoo产品分析 (二) – 商业板块(9) – 网站生成器(1)

    查看Odoo产品分析系列--目录 安装"电子商务"模块时,该模块会自动安装,但网站生成器是电子商务的前提,因此,先分析该模块,在下面就是对电子商务模块的分析. 1. 编辑网站 安装 ...

  3. 【转载】java架构师进阶之路

    Java架构师,应该算是一些Java程序员们的一个职业目标了吧.很多码农码了五六年的代码也没能成为架构师.那成为Java架构师要掌握哪些技术呢,总体来说呢,有两方面,一个是基础技术,另一个就是组织能力 ...

  4. X100S Collection Before 2014/08/01

    风暴前的东京湾 // Tokyo Bay before Storm 上野公园 // Ueno Park

  5. Android 9.0更新

    北京时间2018年8月7日上午,Google 发布了 Android 9.0 操作系统.并宣布系统版本 Android P 被正式命名为代号"Pie". Android 9.0 利 ...

  6. 【数据分析】线性回归与逻辑回归(R语言实现)

    文章来源:公众号-智能化IT系统. 回归模型有多种,一般在数据分析中用的比较常用的有线性回归和逻辑回归.其描述的是一组因变量和自变量之间的关系,通过特定的方程来模拟.这么做的目的也是为了预测,但有时也 ...

  7. 解决tomcat中文传输乱码问题

    <Connector URIEncoding="utf-8" connectionTimeout="20000" encoding="utf-8 ...

  8. IDLE提供的常用快捷键

    IDLE提供的常用快捷键 快捷键 说明 适用于 F1 打开Python帮助文档 Python文件窗口和shell窗口均可用 Alt+P 浏览历史命令(上一条) 仅Python Shell窗口可用 Al ...

  9. 高性能JavaScript模板引擎 artTemplate

    下载地址 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...

  10. win8.1安装win64_11gR2_database_2of2 【INS-13001]】环境不满足最低要求问题

    1. 如图问题: 2. 修改 database\stage\cvu\cvu_prereq.xml, 添加windows 8.1 <OPERATING_SYSTEM RELEASE="6 ...