集合输出
在前面的集合类文章介绍中(List),集合输出的时候都利用了toString(),或者利用了List接口方法。这但些都不是集合的标准输出。
如果从标准上来讲,集合输出一共有四种手段:Iterator, ListIterator, Enumeration, foreach.
迭代输出:Iterator
在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完整方法。
例:标准的Iterator使用
package test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("hello");
list.add("hello");
list.add("java");
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
String string = iterator.next();
System.out.println(string);
}
}
}
运行结果
对于Iterator接口中提供的remove() 方法主要解决的就是集合内容的删除操作
例:删除元素
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("hello");
list.add("hello");
list.add("java");
list.add("C++");
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
String string = iterator.next();
if(string.equals("C++")) {
// 使用集合提供的remove()方法,则会产生ConcurrentModificationException
// list.remove("C++") ;
// 使用Iterator的remove方法则不会产生异常
iterator.remove();
continue;
}
System.out.println(string);
}
}
}
注意:以后在进行集合输出的时候不要修改集合中元素!!!
双向迭代接口:ListIterator
Iterator输出有一个特点:只能够由前向后进行内容的迭代处理,而如果要想进行双向迭代,那么就必须依靠Iterator的子接口:ListIterator来实现。首先来观察一下此接口定义的方法:
判断是否有上一个元素:public boolean hasPrevious();
取得上一个元素:public E previous();
Iterator接口对象是由Collection接口支持的,但是ListIterator是由List接口支持的,List接口提供有如下方法:
取得ListIterator接口对象:public ListIterator listIterator();
例:观察ListIterator接口使用
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("hello");
list.add("hello");
list.add("java");
list.add("C++");
ListIterator<String> listIterator = list.listIterator();
System.out.println("从前往后输出");
while(listIterator.hasNext()) {
System.out.print(listIterator.next() + " ");
}
System.out.println("\n从后往前输出");
while(listIterator.hasPrevious()) {
System.out.print(listIterator.previous() + " ");
}
}
}
注意:如果要想实现由后向前的输出,那么应该首先进行从前向后的输出,否则无法实现双向。
Enumeration枚举输出
在JDK1.0的时候就引入了Enumeration输出接口,而在JDK1.5的时候对其也做了更正,主要是追加了泛型的应用。
首先来观察Enumeration的接口定义:
判断是否有下一个元素:public boolean hasMoreElements();
取得元素:public E nextElement();
但是要想取得这个接口的实例化对象,是不能依靠Collection、List、Set等接口的。只能够依靠Vector子类,因为Enumeration最早的设计就是为Vector服务的,在Vector类中提供有一个取得Enumeration接口对象的方法:
取得Enumeration接口对象:public Enumeration elements()
例:使用Enumeration输出
public class Test {
public static void main(String[] args) {
Vector<String> vector = new Vector<>();
vector.add("hello");
vector.add("hello");
vector.add("java");
vector.add("C++");
Enumeration<String> enumeration = vector.elements();
while(enumeration.hasMoreElements()) {
System.out.print(enumeration.nextElement() + " ");
}
}
}
一些操作类库上依然只支持Enumeration,而不支持Iterator。
foreach输出
从JDK1.5开始foreach可以输出数组,实际上除了数组之外也可以输出集合。
例:使用foreach输出
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("hello");
list.add("helo");
list.add("java");
list.add("C++");
for(String string : list) {
System.out.print(string + " ");
}
}
}
总结:看见集合输出就使用Iterator。