知识点干货—Enumeration和Iterator的对比

Enumeration和Iterator也是Java常见的基础知识点,如果能够对二者有个清晰的认识,知道孰优孰劣,都使用在什么场合,那么在遍历集合元素时,将会游刃有余,得心应手。

我们先来介绍一下两者的概念,代码示例,然后再比较一下它们的相同点和不同之处。

1、简介

我们知道,迭代器是为容器而生的,没有容器就没有迭代器。迭代器的主要功能就是要更快速、便捷的遍历容器中的元素。在遍历容器中的元素时,我们首先想到的就是Enumeration和Iterator。先看一下它们二者的来源。

● Enumeration (枚举)

Enumeration接口是在JDK 1.0上推出的,是最早的的迭代器接口,它推出时就能够对Vector进行遍历输出。并且在JDK 1.5之后对Enumeration类进行了扩充,增加了泛型操作。虽然Enumeration是一个比较旧的类,但是在很多集合遍历中还是能经常看到它的身影。

Enumeration有两个重要的方法:

boolean hasMoreElements()

用来判断是否还下一个元素,如果有则返回true,否则返回false。

E nextElement()

用来获取元素。如果Enumeration指向的枚举对象还有元素,则返回下一个对象,否则抛出NoSuchElementException异常。所以在使用nextElement()前,要首先使用hasMoreElements()方法判断一下是否还有元素可以获取。

另外,Enumeration没有删除元素的方法。

● Iterator(迭代)

称为迭代器,又叫做游标。GOF给出的定义为:提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节,从定义可见,迭代器模式是为容器而生的。
Iterator也是一个接口,完整形式是java.util.Iterator,可以取代Enumeration作为迭代器使用。
Iterator接口中定义了三个方法,它们分别是:

hasNext()

判断是否还有下一个元素。

next()

获取下一个元素。当调用next()方法的时候,并且返回下一个元素,如果没有元素,会报NoSuchElementException异常,所以在使用next()前,要首先使用hasNext()方法判断一下是否还有元素可以获取。

remove()

删除当前元素,一般和next()方法一起用,遍历的时候通过next()方法获取元素,然后通过remove()方法删除。每执行完一次next(),remove()应该被调用一次,如果不执行next(),直接执行remove()方法则报IllegalStateException异常。

2、代码示例

Enumeration的遍历容器方法:

public class TestEnumeration{
   public static void main(String[] args){
      Vector v = new Vector();
      v.addElement("zhangsan");
      v.addElement("lisi");
      v.addElement("wangwu");
      Enumeration e = v.elements();//返回Enumeration枚举对象
      while(e.hasMoreElements()){//通过枚举对象开始遍历Vector,判断是否还有下一个元素
         String value = (String)e.nextElement();//通过枚举的nextElement方法获取Vector的下一个元素
         System.out.print(value);
      }
   }
}

Iterator的遍历容器方法:

public class TestIterator{
   public static void main(String[] args){
      Vector v = new Vector();
      v.addElement("zhangsan");
      v.addElement("lisi");
      v.addElement("wangwu");
      Iterator e = (Iterator) v.elements();//返回Iterator枚举对象
      while(e.hasNext()){//通过枚举对象开始遍历Vector,判断是否还有下一个元素
         String value = (String)e.next();//通过枚举的next方法获取Vector的下一个元素
         System.out.print(value);
      }
   }
}

可以看到二者基本都是相同的用法,只不过使用的方法名称不同。

3、相同点和不同点

相同点:

它们都是接口类,都是迭代器,都用来实现集合或者容器的遍历。

不同点:

(1)、主要区别其实就是Iterator提供删除元素的方法可以删除元素,而Enumration不能。
(2)、Iterator是比较新的迭代器,应该优先使用Iterator。
(3)、Enumeration能够遍历Vector,HashTable,Properties类型集合元素的功能,不支持元素的移除操作。Iterator可以遍历Vector, ArrayList, LinkedList等集合元素,完全可以替代Enumeration。

这里写图片描述
本公众号将以推送Android各种技术干货或碎片化知识,以及整理老司机日常工作中踩过的坑涉及到的经验知识为主,也会不定期将正在学习使用的新技术总结出来进行分享。每天一点干货小知识把你的碎片时间充分利用起来。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值