Java中的枚举和迭代

枚举(Enumeration)和迭代(Iterator)的功能比较类似。

枚举

提供了遍历Vector和HashTable类型集合元素的功能,含有两个方法:
1. boolean hasMoreElements(); 检测是否还有元素,返回布尔值
2. nextElement(); 如果有元素则抛出下一个元素,否则返回NoSuchElementException

源码如下:

 * @see     java.util.Iterator
 * @see     java.io.SequenceInputStream
 * @see     java.util.Enumeration#nextElement()
 * @see     java.util.Hashtable
 * @see     java.util.Hashtable#elements()
 * @see     java.util.Hashtable#keys()
 * @see     java.util.Vector
 * @see     java.util.Vector#elements()

public interface Enumeration<E> {
    /**
     * Tests if this enumeration contains more elements.
     *
     * @return  true if and only if this enumeration object
     *           contains at least one more element to provide;
     *          false otherwise.
     */
    boolean hasMoreElements();

    /**
     * Returns the next element of this enumeration if this enumeration
     * object has at least one more element to provide.
     *
     * @return     the next element of this enumeration.
     * @exception  NoSuchElementException  if no more elements exist.
     */
    E nextElement();
}

栗子:

Enumeration days;
Vector dayNames = new Vector();
dayNames.add("Sunday");
dayNames.add("Monday");
dayNames.add("Tuesday");
days = dayNames.elements();
while (days.hasMoreElements()){
    System.out.println(days.nextElement());
    }

迭代

实现了三个函数: hasNext()、 next()、 remove(),其中remove是枚举所没有的。

 * @see Collection
 * @see ListIterator
 * @see Iterable
 public interface Iterator<E> {
    boolean hasNext();

    E next();

    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

    default void forEachRemaining(Consumersuper E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }

Iterator更集中地用于Collections类中,可以在Collections对象中使用内置方法iterator()建立迭代器。另外,Iterator支持fail-fast机制的:当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。
Java API规范建议,对于较新的程序,Iterator应优先于Enumeration,因为“ Iterator在Java集合框架中代替Enumeration。”

栗子:

    List testlist = new ArrayList<>();
    testlist.add(1);
    testlist.add(2);
    testlist.add(3);
    //for循环
    for(Iterator itr = testlist.iterator();itr.hasNext();) 
        System.out.println(itr.next());
    //while循环
    Iterator itr2 = testlist.iterator();
        while(itr2.hasNext()){
            System.out.println(itr2.next());
        }

你可能感兴趣的:(Java学习)