Enumeration与Iterator介绍

Enumeration

Enumeration简介

       Enumeration(列举),本身是一个接口,不是一个类。Enumeration接口本身不是一个数据结构。但是,对其他数据结构非常重要。 Enumeration接口定义了从一个数据结构得到连续数据的手段。实现 Enumeration 接口的对象,它生成一系列元素,一次生成一个。连续调用 nextElement 方法将返回一系列的连续元素。

       例如,要输出 Vector v的所有元素,可使用以下方法:

 for (Enumeration e = v.elements(); e.hasMoreElements();){
     System.out.println(e.nextElement());
 }

Enumeration 方法介绍

       Enumeration接口提供了一套标准的方法,主要通过向量的元素、哈希表的键以及哈希表中的值进行枚举。由于Enumeration是一个接口,它的角色局限于为数据结构提供方法协议,实现该接口的对象由一系列的元素组成,可以连续地调用nextElement()方法来得到 Enumeration枚举对象中的元素。Enumertion接口中仅定义了下面两个方法。

  1. boolean hasMoreElements()

测试此枚举是否包含更多的元素。

返回值:当且仅当此枚举对象至少还包含一个可提供的元素时,才返回 true;否则返回 false。

  1. E nextElement()

    如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素。

    返回值:此枚举的下一个元素。

    抛出:NoSuchElementException - 如果没有更多的元素存在。

Enumeration代码举例

  1. 使用Enumeration遍历Vector集合
  import java.util.Enumeration;
  import java.util.Vector;  
  
  public class EnumerationTest {
        public static void main(String[] args) {
        
            Vector vector = new Vector();
            vector.addElement("Monday");
            vector.addElement("Tuesday");
            vector.addElement("Wednesday");
            vector.addElement("Thursday");
            
            Enumeration elements = vector.elements();
            while (elements.hasMoreElements()) {
                System.out.println(elements.nextElement());
            }
        }
}

输出的结果为:

Monday
Tuesday
Wednesday
Thursday
  1. 使用Enumeration遍历HashTable(使用枚举获取key的值)
   import java.util.Enumeration;
   import java.util.Hashtable;  
     
   public class EnumerationTest {
       public static void main(String[] args) {

            Hashtable table = new Hashtable();
            table.put("星期一", "Monday");
            table.put("星期二", "Tuesday");
            table.put("星期三", "Wednesday");
            table.put("星期四", "Thursday");
            
            Enumeration keys = table.keys();
            while (keys.hasMoreElements()) {
                String element= keys.nextElement();
                System.out.println(element);
            }
        }
    }

输出的结果为:

星期三
星期二
星期四
星期一
  1. 使用Enumeration遍历HashTable(使用枚举获取value值)
   import java.util.Enumeration;
   import java.util.Hashtable;  
     
   public class EnumerationTest {
       public static void main(String[] args) {

            Hashtable table = new Hashtable();
            table.put("星期一", "Monday");
            table.put("星期二", "Tuesday");
            table.put("星期三", "Wednesday");
            table.put("星期四", "Thursday");
            
            Enumeration values= table.elements();
            while (values.hasMoreElements()) {
                String element= values.nextElement();
                System.out.println(element);
            }
        }
    }

输出的结果为:

Wednesday
Tuesday
Thursday
Monday

Iterator

Iterator简介

       Iterator(迭代器)取代了 Java Collections Framework(Java集合框架) 中的 Enumeration,迭代器与枚举有两点不同:

  • 迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的collection 移除元素。

  • 方法名称得到了改进。

Iterator方法介绍:

  1. boolean hasNext()

如果仍有元素可以迭代,则返回 true。(换句话说,如果 next 返回了元素而不是抛出异常,则返回 true)。

返回值:如果迭代器具有多个元素,则返回 true。
  1. E next()

    返回迭代的下一个元素。

    返回值:迭代的下一个元素。

    抛出:NoSuchElementException - 没有元素可以迭代。

  1. void remove()

从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。每次调用 next 只能调用一次此方法。如果进行迭代时用调用此方法之外的其他方式修改了该迭代器所指向的 collection,则迭代器的行为是不确定的。

抛出:

  • UnsupportedOperationException - 如果迭代器不支持 remove 操作。
  • IllegalStateException - 如果尚未调用 next 方法,或者在上一次调用 next 方法之后已经调用了 remove 方法。

Iterator代码举例

       这里使用Iterator遍历list单列集合,对于map多列集合,在调用keySet()方法或者是entrySet()方法之后同样也是相当于单列集合了。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorTest {

    public static void main(String[] args) {
        
        List list = new ArrayList();
        list.add("Monday");
        list.add("Tuesday");
        list.add("Wednesday");
        
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

输出结果为:

Monday
Tuesday
Wednesday

调用Iterator的remove()方法:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorTest {

    public static void main(String[] args) {
        
        List list = new ArrayList();
        list.add("Monday");
        list.add("Tuesday");
        list.add("Wednesday");
        
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            if ("Wednesday".equals(iterator.next())) {
                iterator.remove();
            }
            System.out.println(list);
        }
    }
}

输出的结果:

[Monday, Tuesday, Wednesday]
[Monday, Tuesday, Wednesday]
[Monday, Tuesday]

注意:每次循环中最好只使用一次next()方法,因为使用一次,指针就会往下走一个,如果在一个循环中使用了两次next()方法,可能会出现NoSuchElementException 的异常,例如:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorTest {

    public static void main(String[] args) {
        
        List list = new ArrayList();
        list.add("Monday");
        list.add("Tuesday");
        list.add("Wednesday");
        
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            if (iterator.next() != null && !"".equals(iterator.next())) {
                // 逻辑处理
            }
        }
    }
}

上面代码,循环一次,指针向后移动两位,这样在第二次循环时,第二个iterator.next()会抛异常。

同样需要注意remove()方法,每次调用只能够在调用了next()方法的前提下才可以移除响应元素。如果调用了多个next()方法后再调用remove()方法,则移除的时最后一次调用next()方法返回的元素。例如:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorTest {

    public static void main(String[] args) {
        
        List list = new ArrayList();
        list.add("Monday");
        list.add("Tuesday");
        list.add("Wednesday");
        list.add("Thursday");
        
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            if (iterator.next() != null && !"".equals(iterator.next())) {
                iterator.remove();
            }
            System.out.println(list);
        }
    }
}

输出的结果为:

[Monday, Wednesday, Thursday]
[Monday, Wednesday]

总结

Enumeration接口是JDK1.0时推出的,在JDK1.5之后为Enumeration接口进行了扩充,增加了泛型的操作应用。Iterator迭代器取代了 Enumeration的功能,同时增添了删除元素的方法,并且对方法的名称进行了改进。为什么还要使用Enumeration?这是因为java的发展经历了很长时间,一些比较古老的系统或者类库中的方法还在使用Enumeration接口,因此为了兼容,还是需要使用Enumeration。已知的对于vactor和hashtable的遍历还可能会使用Enumeration。

你可能感兴趣的:(Enumeration与Iterator介绍)