4、Iterator迭代器
4、1 Iterator實現類與迭代器模式
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.TreeSet;
import java.util.Vector;
enum Sex{
FEMALE , MALE;
}
public class IteratorTest {
public static void main(String[] args) {
HashSet<String> hashSet = new HashSet<>();
System.out.println("HashSet的Iterator:" + hashSet.iterator());
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
System.out.println("LinkedHashSet的Iterator:" + linkedHashSet.iterator());
TreeSet<String> treeSet = new TreeSet<>();
System.out.println("TreeSet的Iterator:" + treeSet.iterator());
EnumSet<Sex> enumSet = EnumSet.allOf(Sex.class);
System.out.println("EnumSet的Iterator:" + enumSet.iterator());
ArrayList<String> arrayList = new ArrayList<>();
System.out.println("ArrayList的Iterator:" + arrayList.iterator());
Vector<String> vector = new Vector<>();
System.out.println("Vector的Iterator:" + vector.iterator());
LinkedList<String> linkedList = new LinkedList<>();
System.out.println("LinkedList的Iterator:" + linkedList.iterator());
ArrayDeque<String> arrayDeque = new ArrayDeque<>();
System.out.println("ArrayDeque的Iterator:" + arrayDeque.iterator());
}
}
輸出結果爲:LinkedHashSet的Iterator:java.util.LinkedHashMap$KeyIterator@5511e28
TreeSet的Iterator:java.util.TreeMap$KeyIterator@2198a037
EnumSet的Iterator:java.util.RegularEnumSet$EnumSetIterator@119fdafc
ArrayList的Iterator:java.util.ArrayList$Itr@1b219665
Vector的Iterator:java.util.Vector$Itr@3a18cecd
LinkedList的Iterator:java.util.LinkedList$ListItr@2e4f7bc2
ArrayDeque的Iterator:java.util.ArrayDeque$DeqIterator@15136019
4、2 迭代時刪除指定的元素
import java.util.ArrayList;
import java.util.Iterator;
public class ArrayListRemove {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("123");
list.add("456");
list.add("789");
for ( Iterator<String> it = list.iterator() ; it.hasNext() ; ) {
String e = it.next();
System.out.println(e);
if ( e.equals("456") ) { //①
list.remove(e);
}
}
}
}
輸出結果:456
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetRemove {
public static void main(String[] args) {
TreeSet<String> set = new TreeSet<>();
set.add("123");
set.add("456");
set.add("789");
for ( Iterator<String> it = set.iterator() ; it.hasNext() ; ) {
String e = it.next();
System.out.println(e);
if ( e.equals("789") ) { //①
set.remove(e);
}
}
}
}
輸出結果爲:456
789
//Iterator實現類(Itr)源代碼
public boolean hasNext() {
return cursor != size;
}
對於Itr遍歷器而言,判斷是否還有下一個元素的標準是:如果下一步即將訪問的元素的索引不等於集合的大小,返回true,否則返回false。當程序使用Iterator遍歷List集合的倒數第二個元素時,下一步即將訪問的元素的索引爲size()-1。如果此時通過List刪除集合的任意一個元素,則將導致集合的size()變爲size()-1,這將導致hasNext()方法返回false。也就是說,遍歷提前結束,Iterator不會訪問List集合的最後一個元素。