Iterator与 Enumeration

"迭代器” (Iterator) ,它属于一种对象,负责选择集合内
的元素,并把它们提供给继承器的用户。作为一个类,它也提供了一级抽象。利
用这一级抽象,可将集合细节与用于访问那个集合的代码隔离开。通过继承器的
作用,集合被抽象成一个简单的序列。继承器允许我们遍历那个序列,同时毋需
关心基础结构是什么——换言之, 不管它是一个矢量、 一个链接列表、 一个堆栈,
还是其他什么东西。这样一来,我们就可以灵活地改变基础数据,不会对程序里
的代码造成干扰。Java 最开始(在 1.0 和 1.1 版中)提供的是一个标准继承器,
名为 Enumeration(枚举) ,为它的所有集合类提供服务。Java 1.2 新增一个更复
杂的集合库, 其中包含了一个名为Iterator的继承器, 可以做比老式的Enumeration
更多的事情。

 1、Iterator和Enumeration的主要区别

Iterator也是一个接口,它的源码如下:

package java.util;

public abstract interface Iterator<E>
{
  public abstract boolean hasNext();

  public abstract E next();

  public abstract void remove();
}

Enumeration是一个接口,它的源码如下:

package java.util;

public abstract interface Enumeration<E>
{
  public abstract boolean hasMoreElements();

  public abstract E nextElement();
}

(1)java中的集合类都提供了返回Iterator的方法,就是迭代器,它和Enumeration(枚举)的主要区别其实就是Iterator可以删除元素,但是Enumration却不能。 
  
(2)还有一点要注意的就是,使用Iterator来遍历集合时,应使用Iterator的remove()方法来删除集合中的元素,使用集合的remove()方法将抛出ConcurrentModificationException异常。 
  
(3)Enumeration 接口的功能与 Iterator 接口的功能是重复的。此外,Iterator 接口添加了一个可选的移除操作,并使用较短的方法名。新的实现应该优先考虑使用 Iterator 接口而不是 Enumeration 接口。 
  
(4)迭代器与枚举有两点不同: 
     ·迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的 collection 移除元素。

  ·方法名称得到了改进。

2、Iterator中的hasnext(),next(),remove()三个方法在哪个类中实现的

通过查看rt.jar 中的源码以及查看jdk-api文档,发现好多类都是用内部类实现这个接口 然后用方法把该类返回给你使用
这就是遍历器模式 如LinkedList、ArrayList等。

ArrayList 内部实现如下:

public Iterator<E> iterator()
{
return new Itr(null);
}

private class Itr
implements Iterator<E>
{
int cursor;
int lastRet = -1;
int expectedModCount = ArrayList.this.modCount;

private Itr()
{
}

public boolean hasNext()
{
return this.cursor != ArrayList.this.size;
}

public E next()
{
checkForComodification();
int i = this.cursor;
if (i >= ArrayList.this.size)
throw new NoSuchElementException();
Object[] arrayOfObject = ArrayList.this.elementData;
if (i >= arrayOfObject.length)
throw new ConcurrentModificationException();
this.cursor = (i + 1);
return arrayOfObject[(this.lastRet = i)];
}

public void remove()
{
if (this.lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try
{
ArrayList.this.remove(this.lastRet);
this.cursor = this.lastRet;
this.lastRet = -1;
this.expectedModCount = ArrayList.this.modCount;
}
catch (IndexOutOfBoundsException localIndexOutOfBoundsException)
{
throw new ConcurrentModificationException();
}
}

final void checkForComodification()
{
if (ArrayList.this.modCount != this.expectedModCount)
throw new ConcurrentModificationException();
}
}

时间: 2024-12-25 21:38:09

Iterator与 Enumeration的相关文章

Java 集合系列18之 Iterator和Enumeration比较

概要 这一章,我们对Iterator和Enumeration进行比较学习.内容包括:第1部分 Iterator和Enumeration区别第2部分 Iterator和Enumeration实例 转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3311275 第1部分 Iterator和Enumeration区别 在Java集合中,我们通常都通过 “Iterator(迭代器)” 或 “Enumerati

Iterator和Enumeration

iterator的hasNext() 和 next()方法用于enumeration的hasMoreElements() 和 nextElement() iterator<FILE> it = a.itreator(); Enumeration<File> en = new  Enumeration<File>(){ @Override public boolean hasMoreElements(){ return it.hasNext(); } @Override

Java集合--Iterator和Enumeration比较

转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3311275 第1部分 Iterator和Enumeration区别 在Java集合中,我们通常都通过 "Iterator(迭代器)" 或 "Enumeration(枚举类)" 去遍历集合.今天,我们就一起学习一下它们之间到底有什么区别. 我们先看看 Enumeration.java 和 Iterator.java的源码,

Iterator和Enumeration的区别

本文介绍一下Iterator和Enumeration的区别及其效率 Iterator是一个接口,它的源码如下: package java.util; import java.util.function.Consumer; public interface Iterator<E> { //返回迭代器刚越过的元素的引用,返回值是Object,需要强制转换成自己需要的类型 boolean hasNext(); //判断容器内是否还有可供访问的元素,返回值是E E next(); //删除迭代器刚越过

Map以及Set的遍历(EntrySet方法,补充enumeration和Iterator的区别)

public void mearge(Map map) { Map returnMap = new HashMap<>(); // 转换为Entry Set<Map.Entry<Object, Object>> entries = map.entrySet(); // 遍历 for (Map.Entry<Object, Object> entry : entries) { Object key = entry.getKey(); Object val = e

java集合18--Iterator和Enumeration比较

概要 这一章,我们对Iterator和Enumeration进行比较学习.内容包括: 第1部分 Iterator和Enumeration区别 第2部分 Iterator和Enumeration实例 转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3311275 第1部分 Iterator和Enumeration区别 在Java集合中,我们通常都通过 "Iterator(迭代器)" 或 &qu

Iterator接口分析

terator是一个集合的迭代器,通过Iterator访问接口就就不用关心集合的实现.Iterator接口中定义了三个方法:1.hasNext()是否还有下一个元素.2.next()返回下一个元素.3.remove()删除当前元素. 只定义了简单的三个方法,这里要注意几点:1)Iterator和Enumeration的区别Iterator是用来替代Enumeration的,Enumeration中只定义了两个方法,不具备删除功能.2)调用next()方法后才可以调用remove()方法,而且每次

[JAVA设计模式]第三部分:结构模式

声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任! 结构模式... 52 适配(Adapter)器模式... 52 类适配器模式结构... 52 对象适配器结构... 53 从Iterator到Enumeration的适配... 54 从Enumeration到Iterator的适配... 54 缺省适配(Default Adapter)器模式... 55 模式结构... 56 与适配器模式区别... 56 J2EE中的缺省适配模式... 5

【Java集合源码剖析】Java集合框架

Java集合工具包位于package java.util下.包含了一些常用的数据结构,如数组.链表(单/双向).树.栈.队列.哈希表等. Java集合框架大致可分为五部分:List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Arrays.Collections). Java集合类的整体框架如下: 如图,Java集合类大致分为两大类:Collection和Map. Collection主要包括两部分:List和Set. List接口通常表示一个列表(数