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本来都读了一遍源码,并且写了一些了,突然在原来的笔记里面发现了收藏的有相关博客,大致看了一下,这些就是我要写的(╹▽╹),而且估计我还写不到博主的水平,这 ...
随机推荐
- 关于table的td和ul元素li隔行变色的功能实现
table元素的td和ul元素li隔行变色的功能实现 利用css控制二者的样式轻松实现隔行换色: 例如:table的css样式控制: table tr td{ background-color:颜 ...
- poj1985和poj1849(树的直径)
题目传送门:poj1985 树是连通无环图,树上任意两点之间的路径是唯一的.定义树上任 意两点u, v的距离为u到v路径上边权的和.树的直径MN为树上最长路 径,即点M和N是树上距离最远的两个点. 题 ...
- [c/c++] programming之路(14)、数组+冒泡和选择排序
一.数组的基本知识 #include<stdio.h> #include<stdlib.h> void main0(){ ]={,,,,};//数组在内存里是连续排列的 int ...
- 剑指offer(7)斐波那契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 题目分析 我们都知道斐波那契可以用递归,但是递归重复计算的部分太多了(虽然可以通过),但是这 ...
- 剑指offer(20)包含min函数的栈
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 题目分析 首先一开始我们分析得到最小值肯定要比较嘛,和栈里面的数据一一比较,但是栈这种数据结构,你又只能和栈顶弹出来的 ...
- T-net 【贪心】
问题 H: T-net 时间限制: 1 Sec 内存限制: 128 MB 提交: 302 解决: 14 [提交] [状态] [命题人:admin] 题目描述 T-net which is a ne ...
- centos6.5下安装tomcat
linux在安装tomcat之前必须已安装jdk 已下载好tomcat 拖到centos系统的桌面 现在在桌面目录下 mv apache-tomcat-8.5.39.tar.gz /usr/local ...
- mvc 之 学习地址
https://blog.csdn.net/mss359681091/article/details/52135861
- 给<input type="color">设置默认值
参考:https://stackoverflow.com/questions/14943074/html5-input-colors-default-color?utm_medium=organic& ...
- ABP权限认证
通过AOP+特性实现 ABP默认的权限验证过滤器 AbpAuthorizationFilter 可以通过继承AsyncAuthorizationFilter 自定义自己的权限过滤器 权限数据存放表 ...