在看各種Java書籍或者博文的時候,老是會遇到Enumeration
、Iterable
和Iterator
這三個接口,若是對這幾個接口不是很明白的話,總會讓本身看着看着就迷惑了,正好這週末,抽空把這三個接口總結一下,一掃以前的各類迷惑。java
Enumeration
(枚舉)接口的做用和Iterator
相似,但只提供了遍歷Vector
和HashTable
類型集合元素的功能,不支持元素的移除操做。數據結構
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); } } }
迭代器是一種模式、可使得序列類型的數據結構的遍歷行爲與被遍歷的對象分離,即咱們無需關心該序列的底層結構是什麼樣子的。只要拿到這個對象,使用迭代器就能夠遍歷這個對象的內部。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
下面經過一個簡單的例子來講明Iterable
和Iterator
,看懂了下面的代碼,也就看明白了Iterable
和Iterator
。rem
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日 於內蒙古呼和浩特。