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. Mybatis入门实例

    MyBatis 简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...

  2. Http(s)与后台交互方式

    前言 Http(s)是前后端交互的主要方式之一,交互技术主要有:Ajax(XMLHttpRequest).Fetch.地址跳转(window.open.location.href).Http(s)与后 ...

  3. Vue Document

    目录 VUE笔记 环境搭建 Vue学习笔记 1.Vue指令 VUE笔记 环境搭建 node -v npm -v npm i -g cnpm --registry=https://registry.np ...

  4. datetime模块+calendar模块

    datetime: """ 模块中的类: datatime 同时有时间和日期 timedelta 主要用于计算时间的跨度 tzinfo 时区相关 time 只关注时间 d ...

  5. JavaScript初学者必看“箭头函数”

    译者按: 箭头函数看上去只是语法的变动,其实也影响了this的作用域. 原文: JavaScript: Arrow Functions for Beginners 译者: Fundebug 为了保证可 ...

  6. Docker多步构建更小的Java镜像

    译者按: 最新版Docker将支持多步构建(Multi-stage build),这样使用单个Dockerfile就可以定义多个中间镜像用于构建,测试以及发布等多个步骤,并且有效减小最终镜像的大小. ...

  7. JS中replace替换全部的正确应用

    一般使用 var str = "test-test-test"; str = "test-test-test".replace("test" ...

  8. Testlink1.9.17使用方法(第十三章 使用中遇到的问题)

    第十三章 使用中遇到的问题 一. 登录Testlink后,新建一个项目后,会出现如下提示: 解决办法:打开Testlink安装文件夹下的config.inc.php文件, 原来:$tlCfg-> ...

  9. Java 时间总结

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/80613024 本文出自[赵彦军的博客] 时区 整个地球分为二十四时区,每个时区都有 ...

  10. (网页)HTMl5的sessionStorage和localStorage

    百度上百度的,记录一下: html5中的Web Storage包括了两种存储方式:sessionStorage和localStorage. sessionStorage用于本地存储一个会话(sessi ...