Java中的Enumeration、Iterable和Iterator接口詳解

前言

在看各種Java書籍或者博文的時候,老是會遇到EnumerationIterableIterator這三個接口,若是對這幾個接口不是很明白的話,總會讓本身看着看着就迷惑了,正好這週末,抽空把這三個接口總結一下,一掃以前的各類迷惑。java

Enumeration

Enumeration(枚舉)接口的做用和Iterator相似,但只提供了遍歷VectorHashTable類型集合元素的功能,不支持元素的移除操做。數據結構

Enumeration接口聲明的方法以下:ide

方法 描述
boolean hasMoreElements() 還有更多要提取的元素時返回true,在枚舉全部元素後返回false
E nextElement() 返回集合中的下一個元素

因爲Enumeration接口已由Iterator取代,全部我這裏就不作更詳細的總結。這裏提供一個簡單的使用Demo:函數

import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

public class EnumerationDemo {
    public static void main(String[] args) {
        Vector v = new Vector();
        v.addElement("Lisa");
        v.addElement("Billy");
        v.addElement("Mr Brown");

        Enumeration e = v.elements();

        while (e.hasMoreElements()) {
            String value = (String)e.nextElement();
            System.out.println(value);
        }

        Hashtable h = new Hashtable();
        h.put("name", "Yanggd");
        h.put("age", "25");
        h.put("location", "內蒙古呼和浩特");

        e = h.keys();

        while (e.hasMoreElements()) {
            String key = (String) e.nextElement();
            String value = (String) h.get(key);
            System.out.println("KEY =>" + key + "; VALUE=>" + value);
        }
    }
}

Iterable和Iterator

迭代器是一種模式、可使得序列類型的數據結構的遍歷行爲與被遍歷的對象分離,即咱們無需關心該序列的底層結構是什麼樣子的。只要拿到這個對象,使用迭代器就能夠遍歷這個對象的內部。code

  • Iterable:實現這個接口的集合對象支持迭代,是能夠迭代的;實現了這個能夠配合foreach使用;
  • Iterator:迭代器,提供迭代機制的對象,具體如何迭代是這個Iterator接口規範的。

Iterable接口有如下三個方法:對象

方法 描述
Iterator iterator() 返回一個Iterator對象
void forEach(Consumer<? super T> action) 對集合中的每一個元素執行action動做
Spliterator spliterator() 返回一個Spliterator對象

Iterator接口有如下三個方法:接口

方法 描述
boolean hasNext() 每次next以前,先調用此方法探測是否迭代到終點
E next() 返回當前迭代元素,同時,迭代遊標後移
void remove() 刪除最近一次已近迭代出出去的那個元素;只有當next執行完後,才能調用remove函數

Java容器中,全部的Collection子類會實現Iteratable接口以實現foreach功能,Iteratable接口的實現又依賴於實現了Iterator的內部類(參照LinkedList中listIterator()和descendingIterator()的JDK源碼)。有的容器類會有多個實現Iterator接口的內部類,經過返回不一樣的迭代器實現不一樣的迭代方式。element

下面經過一個簡單的例子來講明IterableIterator,看懂了下面的代碼,也就看明白了IterableIteratorrem

import java.util.*;

public class IterableDemo implements Iterable<String> {
    private String[] words = "I love coding".split("");

    // 默認迭代器
    public Iterator<String> iterator() {
        // 匿名內部類
        return new Iterator<String>() {
            private int index = 0;

            @Override
            public boolean hasNext() {
                return index < words.length;
            }

            @Override
            public String next() {
                return words[index++];
            }

            @Override
            public void remove() {
                throw new UnsupportedOperationException();
            }
        };
    }

    // 反向迭代器
    public Iterable<String> reverseIterator() {
        return new Iterable<String>() {
            @Override
            public Iterator<String> iterator() {
                return new Iterator<String>() {
                    private int index = words.length - 1;

                    @Override
                    public boolean hasNext() {
                        return index > -1;
                    }

                    @Override
                    public String next() {
                        return words[index--];
                    }

                    @Override
                    public void remove() {
                        throw new UnsupportedOperationException();
                    }
                };
            }
        };
    }

    public static void main(String[] args) {
        IterableDemo iterableDemo = new IterableDemo();

        // 默認迭代器
        for (String value : iterableDemo) {
            System.out.print(value);
        }

        System.out.println();

        // 反向迭代器
        for (String value : iterableDemo.reverseIterator()) {
            System.out.print(value);
        }
    }
}

總結

又是一個小的知識點,再惡補一下。重溫一下這些細節,讓本身之後少掉點坑。get

2019年7月21日 於內蒙古呼和浩特。

相關文章
相關標籤/搜索