Iterator和Enumeration的区别

本文介绍一下Iterator和Enumeration的区别及其效率

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

package java.util;

import java.util.function.Consumer;

public interface Iterator<E> {
    //返回迭代器刚越过的元素的引用,返回值是Object,需要强制转换成自己需要的类型
    boolean hasNext();
    //判断容器内是否还有可供访问的元素,返回值是E
    E next();
   //删除迭代器刚越过的元素
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

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

package java.util;

public interface Enumeration<E> {

    boolean hasMoreElements();

    E nextElement();
}

从源码可以看出,Iterator除了能读取集合的数据之外,也能数据进行删除操作;而Enumeration只能读取集合的数据,而不能对数据进行修改。

Iterator支持fail-fast机制,而Enumeration不支持fail-fast机制。Enumeration 是JDK 1.0添加的接口。使用到它的函数包括Vector、Hashtable等类,这些类都是JDK 1.0中加入的。Iterator是JDK1.2添加的接口,Iterator是基于Enumeration实现的,同时Iterator支持fail-fast机制,所以Iterator遍历集合时会比Enumeration遍历集合慢一些。

使用一个Hashtable集合,然后分别通过 Iterator 和 Enumeration 去遍历它,比较它们的效率。代码如下:

package com.xyfer;

import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;

public class Test {
    public static void main(String[] args) {
        int n;
        Random r = new Random();
        Hashtable t = new Hashtable();
        for (int i = 0; i < 10000; i++) {
            n = r.nextInt(1000);
            t.put(i, n);
        }
        iterateHashtable(t);
        enumeration(t);
    }
    //使用Iterator遍历Hashtable
    private static void iterateHashtable(Hashtable t) {
        long start = System.currentTimeMillis();
        Iterator i = t.entrySet().iterator();
        while (i.hasNext()) {
            Map.Entry entry = (Entry) i.next();
            //System.out.println("key:" + entry.getKey() + "value:" + entry.getValue());
        }
        long end = System.currentTimeMillis();
        useTime(start,end);
    }
    //使用Enumeration遍历Hashtable
    private static void enumeration(Hashtable t) {
        long start = System.currentTimeMillis();
        Enumeration enu = t.elements();
        while (enu.hasMoreElements()) {
            enu.nextElement();
            //Enumeration em = (Enumeration) enu.nextElement();
            //System.out.println(enu.nextElement());
        }
        long end = System.currentTimeMillis();
        useTime(start,end);
    }
    //计算遍历Hashtable所耗时间
    private static void useTime(long start,long end) {
        System.out.println("耗时:"+(end-start)+"ms");
    }

}

控制台打印结果:

从控制打印结果来看,Iterator遍历集合时确实会比Enumeration遍历集合慢一些。

原文地址:https://www.cnblogs.com/xyfer1018/p/10493244.html

时间: 2024-10-10 19:04:45

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

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) ,它属于一种对象,负责选择集合内的元素,并把它们提供给继承器的用户.作为一个类,它也提供了一级抽象.利用这一级抽象,可将集合细节与用于访问那个集合的代码隔离开.通过继承器的作用,集合被抽象成一个简单的序列.继承器允许我们遍历那个序列,同时毋需关心基础结构是什么--换言之, 不管它是一个矢量. 一个链接列表. 一个堆栈,还是其他什么东西.这样一来,我们就可以灵活地改变基础数据,不会对程序里的代码造成干扰.Java 最开始(在 1.0 和 1.1 版中)提

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

Iterator与ListIterator的区别

Iterator与ListIterator 相同点:(1)两者都是fail-fast机制,都是作为内部类实现的. 区别:二者的区别主要是功能上的: (1)Iterator实现了接口Iterator,属性有cursor(下一个要遍历的元素索引),lastRest(上一个遍历元素的索引), 方法有,hasNext(),next(),remove(),forEachRemainint()(遍历剩下的元素) (2)ListIterator继承于Iterator(Itr),并且实现了ListIterato

Iterator和ListIterator的区别 ---面试题

Iterator和ListIterator的区别是什么? 下面列出了他们的区别: Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List. Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向. ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等. 原文地址:https://www.cnblogs.com/sixgodbiao/p/9846746

Java中Iterator与Iterable的区别

Iterable的定义: java.lang包 /** * Implementing this interface allows an object to be the target of * the "foreach" statement. * * @param <T> the type of elements returned by the iterator * * @since 1.5 */ public interface Iterable<T> { /

Python 中 Iterator和Iterable的区别

(转载:http://blog.csdn.net/passionkk/article/details/49929887) Python中 list,truple,str,dict这些都可以被迭代,但他们并不是迭代器.为什么? 因为和迭代器相比有一个很大的不同,list/truple/map/dict这些数据的大小是确定的,也就是说有多少事可知的.但迭代器不是,迭代器不知道要执行多少次,所以可以理解为不知道有多少个元素,每调用一次next(),就会往下走一步,是惰性的. 判断是不是可以迭代,用It

for,foreach,iterator的用法和区别

不同点: 1.形式差别 for的形式是 for(int i=0;i<arr.size();i++){...} foreach的形式是 for(int i:arr){...} iterator的形式是 Iterator it = arr.iterator() while(it.hasNext()){ object o =it.next(); ...} 2.条件差别 for需要知道集合或数组的大小,而且需要是有序的,不然无法遍历: foreach和iterator都不需要知道集合或数组的大小,他们都