18-Java集合-Iterator和Enumeration区别

news/2024/5/18 21:29:26 标签: Iterator, Enumeration, 迭代器, 枚举, java

第1部分 IteratorEnumeration区别

在Java集合中,我们通常都通过 “Iterator(迭代器)” 或 “Enumeration(枚举类)” 去遍历集合。今天,我们就一起学习一下它们之间到底有什么区别。

我们先看看 Enumeration.javaIterator.java的源码,再说它们的区别。

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

package java.util;

public interface Enumeration<E> {

    boolean hasMoreElements();

    E nextElement();
}

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

package java.util;

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

    E next();

    void remove();
}

看完代码了,我们再来说说它们之间的区别。

(01) 函数接口不同
        Enumeration只有2个函数接口。通过Enumeration,我们只能读取集合的数据,而不能对数据进行修改。
        Iterator只有3个函数接口。Iterator除了能读取集合的数据之外,也能数据进行删除操作。

(02) Iterator支持fail-fast机制,而Enumeration不支持。
        Enumeration 是JDK 1.0添加的接口。使用到它的函数包括Vector、Hashtable等类,这些类都是JDK 1.0中加入的,Enumeration存在的目的就是为它们提供遍历接口。Enumeration本身并没有支持同步,而在Vector、Hashtable实现Enumeration时,添加了同步。
        而Iterator 是JDK 1.2才添加的接口,它也是为了HashMap、ArrayList等集合提供遍历接口。Iterator是支持fail-fast机制的:当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。

 

第2部分 IteratorEnumeration实例

下面,我们编写一个Hashtable,然后分别通过 IteratorEnumeration 去遍历它,比较它们的效率。代码如下:

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

/*
 * 测试分别通过 IteratorEnumeration 去遍历Hashtable
 * @author skywang
 */
public class IteratorEnumeration {

    public static void main(String[] args) {
        int val;
        Random r = new Random();
        Hashtable table = new Hashtable();
        for (int i=0; i<100000; i++) {
            // 随机获取一个[0,100)之间的数字
            val = r.nextInt(100);
            table.put(String.valueOf(i), val);
        }

        // 通过Iterator遍历Hashtable
        iterateHashtable(table) ;

        // 通过Enumeration遍历Hashtable
        enumHashtable(table);
    }
    
    /*
     * 通过Iterator遍历Hashtable
     */
    private static void iterateHashtable(Hashtable table) {
        long startTime = System.currentTimeMillis();

        Iterator iter = table.entrySet().iterator();
        while(iter.hasNext()) {
            //System.out.println("iter:"+iter.next());
            iter.next();
        }

        long endTime = System.currentTimeMillis();
        countTime(startTime, endTime);
    }
    
    /*
     * 通过Enumeration遍历Hashtable
     */
    private static void enumHashtable(Hashtable table) {
        long startTime = System.currentTimeMillis();

        Enumeration enu = table.elements();
        while(enu.hasMoreElements()) {
            //System.out.println("enu:"+enu.nextElement());
            enu.nextElement();
        }

        long endTime = System.currentTimeMillis();
        countTime(startTime, endTime);
    }

    private static void countTime(long start, long end) {
        System.out.println("time: "+(end-start)+"ms");
    }
}

运行结果如下:

time: 9ms
time: 5ms

从中,我们可以看出。EnumerationIterator 的遍历速度更快。为什么呢?
这是因为,Hashtable中Iterator是通过Enumeration去实现的,而且Iterator添加了对fail-fast机制的支持;所以,执行的操作自然要多一些。

参考:http://www.cnblogs.com/skywang12345/p/3311275.html


http://www.niftyadmin.cn/n/1702440.html

相关文章

synchronize与ReentrantLock区别【原创】

synchronize、ReentrantLock区别 共同点&#xff1a; 都是可重入锁&#xff0c;都可以在一个锁中调用另一个被同一个锁锁定的方法。 区别&#xff1a; synchronize锁 1、synchronize是java的关键字&#xff0c;是java语言内置的特性&#xff0c;是在JVM层面上实现的 2、无…

PAT 1009 Product of Polynomials

1009. Product of Polynomials (25) 时间限制400 ms内存限制65536 kB代码长度限制16000 B判题程序Standard作者CHEN, YueThis time, you are supposed to find A*B where A and B are two polynomials. Input Specification: Each input file contains one test case. Each cas…

StyleCop学习笔记——自定义规则

本文将简单的一步一步的指导这可能有助于学习如何创建自己的规则1、创建一个项目。 Visual Studio创建一个新的类库项目.NET3.5 2、引用两个DLL&#xff0c;StyleCop.dll和StyleCop.Csharp.dll. 3、添加自定义的规则。 MyCustomAnalyzer.cs代码如下&#xff1a; [csharp] vie…

Mysql隔离级别

MySQL数据库事物的4大特性&#xff1a; 事务ACID属性&#xff0c;即原子性&#xff08;Atomicity&#xff09;、一致性(Consistency)、隔离性&#xff08;Isolation&#xff09;、持久性&#xff08;Durability&#xff09;。 四大隔离级别&#xff1a; 由低到高依次为Readu…

数据库多版本并发控制-MVCC

MVCC的原理 MVCC(Multiversion Concurrency Control多版本并发控制)&#xff1a; MVCC每次更新操作都会复制一条新的记录&#xff0c;新纪录的创建时间为当前事务id优势为读不加锁&#xff0c;读写不冲突InnoDb存储引擎中&#xff0c;每行数据包含了一些隐藏字段 DATA_TRX_ID…

二叉树 — 给定二叉树中某个节点,返回该节点的后继节点

后继节点定义&#xff1a; 二叉树以中序的方式进行遍历打印&#xff0c;节点X的下一个节点&#xff0c;就是X的后继节点。 假设二叉树如下图所示&#xff1a;则中序遍历的后打印出来的就是 4 -> 2 -> 5 -> 1 -> 6 -> 3 -> 7。如果X 3&#xff0c;则X的后继节…

mappingResources,annotatedClasses(映射)

这两个是有本质区别的&#xff0c;光看名字也能看出来&#xff0c;哈哈&#xff0c;好了&#xff0c;入正题&#xff1a; mappingResources用于指定少量的hibernate配置文件像这样 Xml代码 1234567<property name"mappingResources"> <list> <value&…

数据库索引实现原理

MySQL索引实现 在MySQL中&#xff0c;索引属于存储引擎级别的概念&#xff0c;不同存储引擎对索引的实现方式是不同的&#xff0c;本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。 MyISAM索引实现 MyISAM引擎使用BTree作为索引结构&#xff0c;叶节点的data域存放的…