在Java中,对于所有的Collection,都有一个特性,可以通过迭代器来遍历和删除其中的元素,因为Collection接口继承自Iterable接口.

public interface Collection<E> extends Iterable<E>

Iterable接口中只有一个方法:

    /**
该接口的实现类可以被用于"foreach"语句
* @since 1.5
*/
public interface Iterable<T> {
// 返回对象的迭代器
Iterator<T> iterator();
}

Iterable接口除了提供iterator()方法返回迭代器之外,所有实现了Iterable接口的类都可以通过foreach语句调用.

其实,foreach语句遍历Collection的本质就是对Iterable接口的调用.

关于foreach的具体原理,可以参考:

Java for-each 原理相关解析

java foreach原理

接下来看iterator()方法返回的Iterator接口,其为具体的迭代器实现提供了规范和指引:

/**
对指定Collection的迭代器,用于替换之前的迭代器接口Enumeration.
Iterator与Enumeration的区别在于:
1. Iterator允许在well-defined semantics的情况下删除Collection中的元素(这个是可选操作);
2. 方法名更加精炼;
well-defined semantics:生硬一点可以翻译为"语义良好的",这里为了不引起误解,使用原英文;
@since 1.2
*/
public interface Iterator<E> { // 如果还有更多元素,返回true,否则返回false;
// 如果返回true,调用next()会返回下一个元素;
boolean hasNext(); // 返回迭代过程中的下一个元素,如果没有下一个元素,抛出NoSuchElementException;
// hasNext()返回true是next()会返回下一个元素的保证;
E next(); // 移除Collection中上一次调用next()方法返回的对象,这是一个可选操作(optional operation);
// 如果调用remove()之前没有调用next()方法,抛出UnsupportedOperationException;
// 如果调用next()之后,调用了remove()方法,在下一次调用remove()方法之前,如果没有再次调用next()方法,则remove()方法抛出IllegalStateException;
// 后面这两条应当视为well-defined semantics的一些规定了,除此之外remove()方法还可能涉及到fast-fail机制等;
void remove();
}

Iterator包含的方法已经将其作为一个迭代器的本质表现得一丝不挂.而其诞生的目的是用于替换老旧的Enumeration接口.

本篇只讲Iterator接口的jdk设计,至于其使用,我们在讲述具体Collection时再陈述.因为每个具体的实现都不同,且其中还涉及到fast-fail机制等.

基于之前读过的很多资料还是有关于Enumeration的使用,让人心烦,所以还是看一下这个接口的具体内容.

/**
一个实现该Enumeration接口的对象能够遍历一系列元素.每次调用nextElement返回这个系列中的下一个元素;
这个类与Iterator的功能重复,新的迭代器推荐使用Iterator实现;
* @since JDK1.0
*/
public interface Enumeration<E> { // 如果还有更多元素,返回true,否则返回false;
// 如果返回true,调用next()方法会返回下一个元素;
// 这个方法对应Iterator的hasNext()方法;
boolean hasMoreElements(); // 返回迭代过程中的下一个元素,如果没有下一个元素,抛出NoSuchElementException;
// hasMoreElements()返回true是nextElement方法会返回下一个元素的保证;
// 该方法对应Iterator的next()方法;
E nextElement();
}

Enumeration 接口自jdk1.0就添加进来了,常见的使用Enumeration的地方包括:

  1. 在Vector中用于遍历元素;
  2. 在Hashtable用于对keys和values的遍历;
  3. 在SequenceInputStream用于指定多个InputStream进行对象构造;

Java容器解析系列(1) 迭代的进化——从Enumeration到Iterator的更多相关文章

  1. Java容器解析系列(0) 开篇

    最近刚好学习完成数据结构与算法相关内容: Data-Structures-and-Algorithm-Analysis 想结合Java中的容器类加深一下理解,因为之前对Java的容器类理解不是很深刻, ...

  2. Java容器解析系列(11) HashMap 详解

    本篇我们来介绍一个最常用的Map结构--HashMap 关于HashMap,关于其基本原理,网上对其进行讲解的博客非常多,且很多都写的比较好,所以.... 这里直接贴上地址: 关于hash算法: Ha ...

  3. Java容器解析系列(13) WeakHashMap详解

    关于WeakHashMap其实没有太多可说的,其与HashMap大致相同,区别就在于: 对每个key的引用方式为弱引用; 关于java4种引用方式,参考java Reference 网上很多说 弱引用 ...

  4. Java容器解析系列(10) Map AbstractMap 详解

    前面介绍了List和Queue相关源码,这篇开始,我们先来学习一种java集合中的除Collection外的另一个分支------Map,这一分支的类图结构如下: 这里为什么不先介绍Set相关:因为很 ...

  5. Java容器解析系列(7) ArrayDeque 详解

    ArrayDeque,从名字上就可以看出来,其是通过数组实现的双端队列,我们先来看其源码: /** 有自动扩容机制; 不是线程安全的; 不允许添加null; 作为栈使用时比java.util.Stac ...

  6. Java容器解析系列(8) Comparable Comparator

    Comparable和Comparator接口是两个用于对对象进行大小比较的接口,在java集合相关类中,也被经常地使用到. 关于其使用,可以参考网络上的其他博客(没什么好说的);这里阐述关于这两个接 ...

  7. Java容器解析系列(9) PrioriyQueue详解

    PriorityQueue:优先级队列; 在介绍该类之前,我们需要先了解一种数据结构--堆,在有些书上也直接称之为优先队列: 堆(Heap)是是具有下列性质的完全二叉树:每个结点的值都 >= 其 ...

  8. Java容器解析系列(6) Queue Deque AbstractQueue 详解

    首先我们来看一下Queue接口: /** * @since 1.5 */ public interface Queue<E> extends Collection<E> { / ...

  9. Java容器解析系列(4) ArrayList Vector Stack 详解

    ArrayList 这里关于ArrayList本来都读了一遍源码,并且写了一些了,突然在原来的笔记里面发现了收藏的有相关博客,大致看了一下,这些就是我要写的(╹▽╹),而且估计我还写不到博主的水平,这 ...

随机推荐

  1. tensorflow输出

    在Session对象上调用run()函数,执行流图,即可得到输出, 可获取单个输出,也可获取多个输出 import tensorflow as tf import numpy as np consta ...

  2. tiny6410 uboot启动参数的问题

    使用uboot来启动tiny6410,需要在启动参数中加入lcd=S70,才能在lcd上显示正确的画面

  3. FangDD Java编程规范

    我们采用<Oracle/Sun原生的Java编程规范>和<Google Java编程规范> Google Java编程风格指南 January 20, 2014 作者:Haws ...

  4. Solution about MB STAR C4, MB STAR C5 Update and can not test vehicles problems

    Solution about MB Star C4, MB Star C5 Update and can not test vehicles problems 1. Make sure your co ...

  5. npm报错处理

    在npm install 命令下载的时候经常会出现下面的报错: 解决办法: npm cache clean --force npm install

  6. 高度自适应不能触发transition的解决方法

    1. 前言  在我们不能确定一个元素的高度的时候,要使用transition过渡,是不会触发的,比如一个p标签 内容行数不固定  我们可能就要初始 height: 0 ; 过渡到 height: au ...

  7. Eclipse中XML文件自定义格式化配置

    1,编码格式:UTF-8 2,Line Width:90,Indent using spaces:2 3,默认编辑器 当添加Spket插件后,xml文件默认编辑器将被修改为Spket,要求恢复默认,则 ...

  8. Generative Adversarial Nets

    1. 基本思想 两个模型: 判别器:预测从生成器生成的样本的概率 生成器:生成样本时,最大化使得判别器发生错误的概率 最后得到唯一解:使得生成器生成的样本输入到判别器中,得到的概率全是1/2.    ...

  9. 面试神体验之:get和post的区别

    由于本文是用markdown在本地编辑的,粘贴到本地的时候出现了一些页面bug,所以只好贴进代码里面,一些链接失效,望见谅 Get和POST的区别 都9102年了,你们还在问get和post的区别?是 ...

  10. (转) Ensemble Methods for Deep Learning Neural Networks to Reduce Variance and Improve Performance

    Ensemble Methods for Deep Learning Neural Networks to Reduce Variance and Improve Performance 2018-1 ...