從JDK1.8開始Iterable接口中提供的用于集合輸出的forEach()方法使用較少,常用的四種集合輸出形式:Iterator疊代輸出、ListIterator雙向疊代輸出、Enumeration枚舉輸出、foreach輸出
1、Iterator疊代輸出
擷取Iterator接口對象:public Iterator<E> iterator()
Iterator接口中定義的方法:
判斷是否有資料:public boolean hasNext()
取出目前資料:public E next()
删除:default void remove()
在java.util.Scanner類中使用過上述方法,因為其就是Iterator接口的子類。
示例:
Set<String> all = Set.of("a","v","s") ;
Iterator<String> iter = all.iterator() ; //執行個體化Iterator對象
while(iter.hasNext()) {
String str = iter.next() ;
System.out.println(str) ;
}
【重要】對于Iterator接口中的remove()方法,在Collection接口中也定義有,但是在進行疊代輸出的過程中如果使用Collection接口中的remove()方法(all.remove("v"))會報并發更新異常“java.util.ConcurrentModificationException”,不能删除,是以要使用Iterator接口中的remove()方法:iter.remove() ;該方法會删除原始集合中的資料。
2、ListIterator雙向疊代輸出
使用Iterator進行的疊代輸出隻允許由前向後輸出,進行雙向疊代輸出必須依靠Iterator的子接口ListIterator實作。Collection接口中沒有定義擷取ListIterator接口對象的方法,但是List子接口中有,也就是說這個輸出接口是專門為List接口準備的。ListIterator接口中定義的新方法:
判斷是否有前一個元素:public boolean hasPrevious()
擷取目前元素:public E previous()
示例:
import java.util.ArrayList ;
import java.util.List ;
import java.util.ListIterator ;
public class JavaDemo {
public static void main(String[] args) {
List<String> all = new ArrayList<String>() ;
all.add("a") ;
all.add("v") ;
all.add("s") ;
ListIterator<String> iter = all.ListIterator() ;
System.out.println("右前向後輸出:") ;
while(iter.hasNext()) {
System.out.println(iter.next()) ;
}
System.out.println("右後向前輸出:") ;
while(iter.hasPrevious()) {
System.out.println(iter.Previous()) ;
}
}
}
注意:要想實作由後向前周遊必須先實作右前向後周遊。
3、Enumeration枚舉輸出(JDK1.0)
該接口為Vector類服務,擷取Enumeration接口對象就需使用Vector類中的方法:public Enumeration<E> elements()
Enumeration接口中定義的方法:
判斷是否有下一個元素:public boolean hasMoreElements()
擷取目前元素:public E nextElement()
4、foreach輸出
除了使用疊代接口實作輸出之外,從JDK1.5開始加強型for循環也可以實作集合的輸出
for(String str : all ) { System.out.println(str) ; }
5、利用Iterator輸出Map集合
Map集合裡實際上儲存的是一組Map.Entry接口對象(裡面包裝的是key與value),即仍是單值的儲存,而Map集合中的方法:将全部的Map集合轉為Set集合:public Set<Map.Entry<K,V>> entrySet()
示例:
public class JavaDemo {
public static void main(String[] args) {
Map<Sting,Integer> map = new HashMap<String,Integer>() ;
map.put("one",1) ;
map.put("two",2) ;
map.put("three",3) ;
Set<Map.Entry<Sting,Integer>> set = map.entrySet() ; //将Map集合變為Set集合
//利用foreach輸出Map集合
for(Map.Entry<String,Integer> entry : set) {
System.out.println(entry.getKey()) ;
}
//利用Iterator輸出Map集合
Iterator<Map.Entry<Sting,Integer>> iter = set.iterator() ;
while(iter.hasNext()) {
Map.Entry<String,Integer> me = iter.next() ;
System.out.println(me.getKey()) ;
}
}
}