前言
在看各類Java書籍或者博文的時候,總是會遇到Enumeration
、Iterable
和Iterator
這三個介面,如果對這幾個介面不是很明白的話,總會讓自己看著看著就迷惑了,正好這週末,抽空把這三個介面總結一下,一掃之前的各種迷惑。
Enumeration
Enumeration
(列舉)介面的作用和Iterator
類似,但只提供了遍歷Vector
和HashTable
型別集合元素的功能,不支援元素的移除操作。
Enumeration
介面宣告的方法如下:
方法 | 描述 |
---|---|
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
迭代器是一種模式、可以使得序列型別的資料結構的遍歷行為與被遍歷的物件分離,即我們無需關心該序列的底層結構是什麼樣子的。只要拿到這個物件,使用迭代器就可以遍歷這個物件的內部。
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
介面的內部類,通過返回不同的迭代器實現不同的迭代方式。
下面通過一個簡單的例子來說明Iterable
和Iterator
,看懂了下面的程式碼,也就看明白了Iterable
和Iterator
。
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);
}
}
}
總結
又是一個小的知識點,再惡補一下。重溫一下這些細節,讓自己以後少掉點坑。
2019年7月21日 於內蒙古呼和浩特。