Iterator的意思是迭代器。
在JDK源码中,Iterator是一个接口。
源码中,实现了Iterator接口的类,有很多:见图
1) java.util.*包中,所熟悉的一些Collection子类:AbstractList HashMap Hashtable
LinkedHashMap LindedList TreeMap等;
2) java.util.concurrent*包中,诸如 ArrayBlockingQueue
ConcurrentHashMap ConcurrentLinkedQueue等
3) javax.imageio.*包,javax.print.*包,javax.xml.*包中都存在这样的类(who implemented Iterator接口)
迭代器相关的接口有两个:Iterator
与 Iterable
从名字中,就能猜出它两啥用途:
Iterator意思为迭代器,Iterator及其子类通常是迭代器/迭代子本身的结构与方法;
Iterable意为可迭代的,那些想用到迭代器功能的其它类,如AbstractList HashMap等,需要实现该接口。
细看下两个接口文件:
Iterator.java (只有三个方法)
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
Iterable.java (只有一个方法)
public interface Iterable<T> {
Iterator<T> iterator();
}
通常的用法是:
某个类A(如 AbstractList )想使用迭代器,则它的类声明需是:class A implement
Iterable
那么类A实现中,要实现Iterable接口中的唯一方法:Iterator<T>
iterator();
这个方法用于返回一个迭代器/迭代子,即Iterator接口及其子类;
然后在类A中,定义一个内部类S,专门用于实现Iterator接口,定制类A自已的迭代器实现。
即:
class A implement Iterable
{
Iterator<T> iterator() {...}
class S implement Iterator<E>
{
boolean hasNext() {....}
E next() {....}
void remove() {....}
}
}
另外一个类B (如HashMap)也想使用迭代器,则依葫芦画瓢,方法、类声明啥的都一样,只是方法体不同。
所以,若A类的一个对象a想使用迭代器功能,则需要:
1) 获取迭代器对象: Iterator<E> iter = a.iterator();
2) 然后可以使用迭代器的三个方法进行迭代操作:
iter.hasNext()
iter.next() iter.remove()
举例,看看AbstractList类:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
protected AbstractList() {
}
...
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
int cursor = 0;
int lastRet = -1;
int expectedModCount = modCount;
public boolean hasNext() {
return cursor != size();
}
public E next() {
checkForComodification();
try {
E next = get(cursor);
lastRet = cursor++;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
public void remove() {
if (lastRet == -1)
throw new IllegalStateException();
checkForComodification();
try {
AbstractList.this.remove(lastRet);
if (lastRet < cursor)
cursor--;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException e) {
throw new ConcurrentModificationException();
}
}
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
}
- 大小: 60.7 KB
分享到:
相关推荐
文章目录Iterator源码剖析(一)简介(二)源码分析 Iterator源码剖析 (一)简介 Iterabtor是从jdk1.2就存在的接口,称为外部迭代器。支持对容器中的元素进行遍历和移除,还支持流式遍历 外部迭代器的特点是:可拔...
本文讨论的源代码版本是JDK 1.4.2,因为JDK 1.5在java.util中使用了很多泛型代码,为了简化问题,所以我们还是讨论1.4版本的代码。 集合类的根接口Collection Collection接口是所有集合类的根类型。它的一个主要的...
Iterable是从jdk1.5就存在的接口,称为内部迭代器,常用作容器类的接口,以支持遍历操作(同时支持流式遍历) 内部迭代器的特点是嵌入,其迭代行为必须在容器对象内部实现(借助了外部比较器)。一个类如果实现了...
集合源码 JDK-Collection集合入门 总的list和set类结构大致如下所示 Map不继承Collection,其结构如下 首先介绍下迭代器的概念 迭代器无非是一个接口,假设我们有一个数组,如果我们要实现迭代器,只需要根据该接口定义...
Collection接口是集合层次结构中的根接口。 (1)下面是常用集合类关系图 Collection |___List 有序,可重复 |___ArrayList |___LinkedList |___Vector |___Set 无序,不可重复 |___HashSet |_...
iterator forEach sort removeIf Vector different with ArrayList 2018/3/26 ChangeLogs LinkedList ctor-2 addFirst addLast addAll add indexOf lastIndexOf peek 获取第一个元素,是 null 就返回 null peekFirst...
jdk1.8源码学习笔记,人话翻译 前言:前预算开始学习了一些基本的数据结构和算法,算是被弥补了这方面的知识短板,但是可以对一些算法的了解,目前工作当中也并没有应用到这些,因此希望通过结合实际例子来学习,...
4.4 如何使用jdk8的新特性LocalDate和LocalDateTime 31 4.5 时间戳 32 6网络 33 Jsoup介绍: 34 Jsoup主要有以下功能: 34 Demo1:抓取校园网首页的新闻标题 35 //从目标页面下载所有图片到本地 36 7异常 45 2.Java...
实例209 Iterator迭代器的使用 370 实例210 谁是幸运儿 371 实例211 自定义Queue队列 373 实例212 List、Set与Array之间的相互转换 375 实例213 二分查找法的实现方法 377 实例214 模拟操作系统的进程调度 379 实例...
实例1 下载、安装并配置JDK 1 实例2 第一个Java程序 3 实例3 在Eclipse中创建第一个Java程序 4 常见问题 javac不是内部或者外部命令 6 常见问题 找不到类文件 6 常见问题 语法错误 7 第2章 Java基础语法 9 ...
学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在子类中再定义一个内部类来重写其父类中的内部类? 211 6.7.4 局部内部类 211 6.7.5 匿名内部类 212 6.7.6 闭包(Closure)和回调 215 6.8 ...
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。...
1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是...
实例209 Iterator迭代器的使用 370 实例210 谁是幸运儿 371 实例211 自定义Queue队列 373 实例212 List、Set与Array之间的相互转换 375 实例213 二分查找法的实现方法 377 实例214 模拟操作系统的进程调度 379...