在之前进行集合输出的时候都利用了toString(),或者利用了List接口中的get()方法。这些都不是集合的标准输出。
如果从标准上来讲,集合输出一共有四种手段:Iterator、ListIterator、Enumeration、foreach,接下来就详细讲述一下这几种方法
一、迭代输出
在JDK1.5之前,在Collection接口中就定义有iterator()方法,通过此方法可以取得Iterator接口的实例化对象;而在
JDK1.5之后,将此方法提升为Iterable接口中的方法。无论你如何提升,只要Collection有这个方法,那么List、Set
也一定有此方法。
对于Iterator接口最初的设计里面实际有三个抽象方法:
- 判断是否有下一个元素: public boolean hasNext();
- 取得当前元素: public E next();
- 删除元素: public default void remove(); 此方法从JDK1.8开始变为default完整方法
public class TestIterator {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("wo");
list.add("ni");
list.add("ta");
System.out.println(list);
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
// 注意next方法在同一个循环中不能出现俩次,否则会抛出NoSuchElementException
String str = iterator.next();
if (str.equals("wo")) {
iterator.remove();
continue;
}
System.out.println(str);
}
}
}
结果:ni ta
二、 双向迭代接口:ListIterator
Iterator输出有一个特点:只能够由前向后进行内容的迭代处理,而如果要想进行双向迭代,那么就必须依靠
Iterator的子接口:ListIterator来实现。首先来观察一下此接口定义的方法:
- 判断是否有上一个元素:public boolean hasPrevious();
- 取得上一个元素:public E previous();
Iterator接口对象是由Collection接口支持的,但是ListIterator是由List接口支持的,List接口提供有如下方法:
取得ListIterator接口对象:public ListIterator listIterator()
public class TestListIterator {
public static void main(String[] args) {
List<String> list = new ArrayList<>() ;
list.add("Hello") ;
list.add("Hello") ;
list.add("B") ;
list.add("Bit") ;
ListIterator<String> iterator=list.listIterator();
System.out.print("从前向后输出: ") ;
while (iterator.hasNext()) {
System.out.print(iterator.next()+"、") ;
}
System.out.println("\n从后向前输出: ") ;
while(iterator.hasPrevious()){
System.out.println(iterator.previous());
}
}
}
如果要想实现由后向前的输出,那么应该首先进行从前向后的输出,否则无法实现双向。
三、Enumeration枚举输出
定义:
- 判断是否有下一个元素:public boolean hasMoreElements();
- 取得元素:public E nextElement();
- 要想取得这个接口的实例化对象,是不能依靠Collection、List、Set等接口的。只能够依靠Vector子类,因为Enumeration最早的设计就是为Vector服务的,在Vector类中提供有一个取得Enumeration接口对象的方法:public Enumeration elements();
public class TestEnumeration {
public static void main(String[] args) {
Vector<String> vector=new Vector<>();
vector.add("wo");
vector.add("ni");
vector.add("ta");
Enumeration<String> iterator=vector.elements();
while(iterator.hasMoreElements()){
System.out.println(iterator.nextElement());
}
}
}
四、foreach输出
public class TestForeach {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("wo");
list.add("ni");
list.add("ta");
System.out.println(list);
for(String a:list){
System.out.println(a);
}
}
}
总结
一些操作类库上依然只支持Enumeration,而不支持Iterator。看见集合输出就用Iterator