Java容器解析系列(1) 迭代的进化——从Enumeration到Iterator
在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的地方包括:
- 在Vector中用于遍历元素;
- 在Hashtable用于对keys和values的遍历;
- 在SequenceInputStream用于指定多个InputStream进行对象构造;
Java容器解析系列(1) 迭代的进化——从Enumeration到Iterator的更多相关文章
- Java容器解析系列(0) 开篇
最近刚好学习完成数据结构与算法相关内容: Data-Structures-and-Algorithm-Analysis 想结合Java中的容器类加深一下理解,因为之前对Java的容器类理解不是很深刻, ...
- Java容器解析系列(11) HashMap 详解
本篇我们来介绍一个最常用的Map结构--HashMap 关于HashMap,关于其基本原理,网上对其进行讲解的博客非常多,且很多都写的比较好,所以.... 这里直接贴上地址: 关于hash算法: Ha ...
- Java容器解析系列(13) WeakHashMap详解
关于WeakHashMap其实没有太多可说的,其与HashMap大致相同,区别就在于: 对每个key的引用方式为弱引用; 关于java4种引用方式,参考java Reference 网上很多说 弱引用 ...
- Java容器解析系列(10) Map AbstractMap 详解
前面介绍了List和Queue相关源码,这篇开始,我们先来学习一种java集合中的除Collection外的另一个分支------Map,这一分支的类图结构如下: 这里为什么不先介绍Set相关:因为很 ...
- Java容器解析系列(7) ArrayDeque 详解
ArrayDeque,从名字上就可以看出来,其是通过数组实现的双端队列,我们先来看其源码: /** 有自动扩容机制; 不是线程安全的; 不允许添加null; 作为栈使用时比java.util.Stac ...
- Java容器解析系列(8) Comparable Comparator
Comparable和Comparator接口是两个用于对对象进行大小比较的接口,在java集合相关类中,也被经常地使用到. 关于其使用,可以参考网络上的其他博客(没什么好说的);这里阐述关于这两个接 ...
- Java容器解析系列(9) PrioriyQueue详解
PriorityQueue:优先级队列; 在介绍该类之前,我们需要先了解一种数据结构--堆,在有些书上也直接称之为优先队列: 堆(Heap)是是具有下列性质的完全二叉树:每个结点的值都 >= 其 ...
- Java容器解析系列(6) Queue Deque AbstractQueue 详解
首先我们来看一下Queue接口: /** * @since 1.5 */ public interface Queue<E> extends Collection<E> { / ...
- Java容器解析系列(4) ArrayList Vector Stack 详解
ArrayList 这里关于ArrayList本来都读了一遍源码,并且写了一些了,突然在原来的笔记里面发现了收藏的有相关博客,大致看了一下,这些就是我要写的(╹▽╹),而且估计我还写不到博主的水平,这 ...
随机推荐
- AARRR海盗模型简介
整理下AARRR模型的概念.实际应用场景等问题,初步感觉这个模型主要应用在APP应用分析中. 1.什么是AARRR模型 AARRR是Acquisition.Activation.Retention.R ...
- Linux基础命令---accept/reject 允许拒绝发送打印请求
accept accept指令用来设置允许向目标打印机发送打印任务. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora. 1.语法 cupsaccept ...
- vue mand-mobile ui加class不起作用的问题 css权重问题
vue mand-mobile ui加class不起作用的问题 css权重问题组件的样式优先权比自己定的class高多加几层权重才行,要直接用样式覆盖也可以在前面多加几层class,定位更精确了才会覆 ...
- Oracle经典书籍
Oracle实用教程 深入浅出Oracle
- iOS项目之WKWebView替换UIWebView相关
在网上已经有了许多关于UIWebView替换为WKWebView的文章,所以在这里就不在多说替换的细节了,不会的可以在网上搜搜. 下面是我在项目中遇到的问题: 问题一:在UIWebView中,网页显示 ...
- 基础的基于QT的图像查看程序
代码来自<QT5.9c++开发指南>,因为实现了图片的遍历显示,对于将来编写ImageShop一类的图像程序来说将非常有用(这个程序目前存在一定问题,在研究过程中进行解决) 一.基本功能 ...
- python scrapy baidu image【转】
原 https://github.com/vivianLL/baidupictures #!/usr/bin/env Python # coding=utf-8 #__author__ = 'leil ...
- 【Python64-tkinter_label组件】
一.label组件用于在屏幕上显示文本活图像,Label组件仅能显示单一字体的文本,单文本可以跨越多行.另外还可以为其中的个别字符加上下划线 二.如何使用label组件 使用label组件,你可以指定 ...
- 原生js实现九宫格,全解析
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Ansible 的初步使用
在安装好ansible以后,首先使用ansible -h命令和ansible --version 命令查看帮助手册和版本信息. ansible 配置文件 ansible 的配置文件有多个位置,查找顺序 ...