从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()) ;
}
}
}