集合的输出
一.集合的输出
集合输出实际上从JDK1.8开始就在Iterable接口之中提供有一个forEach()方法,但是这种方法的迭代输出并不是传统意义上的集合的输出形式,并且也很难在实际的开发之中出现.而对于集合的操作而言,一共定义有四种输出的形式:Iterator迭代输出,ListIterator双向迭代输出,Enumeration枚举输出,foreach输出.
二.Iterator输出
通过Collection接口的继承关系可以发现,从JDK1.5开始其多继承了一个Iterator父接口,并且在这个接口里面定义有一个Iterator()操作方法,通过此方法可以获取Iterator接口对象(在JDK1.5之前,这一方法直接定义在Collection接口之中).
获取Iterator接口对象: Iterator<E> iterator()
--在Iterator接口之中,定义有如下的方法:
判断是否有数据: boolean hasNext()
取出当前数据:boolean hasNext()
删除: default void remove()
--在之前提到过的Scanner类(点击此处查看原文)中,可以发现Scanner类就是Iterator的子类,所以此时的类继承结构如下:
--使用Iterator输出:
1 public class IteratorDemo {
2 public static void main(String[] args) {
3 Set<String> all = new HashSet<>();
4 all.add("Hello");
5 all.add("World");
6 all.add("test");
7 Iterator<String> iterator = all.iterator();
8 while (iterator.hasNext()){
9 System.out.println(iterator.next());
10 }
11 }
12 }
--这便是集合输出之中最为标准的输出结构,但是对于Iterator接口中的remove()方法的使用需要特别注意(如果不是必须不要使用).实际上在Collection接口中定义了删除的方法,但是在进行迭代输出的时候,如果使用了Collection之中定义的remove()方法,会导致迭代失败.因此只能利用Iterator接口中的remove方法删除
1 public class IteratorDemo {
2 public static void main(String[] args) {
3 Set<String> all = new HashSet<>();
4 all.add("Hello");
5 all.add("World");
6 all.add("test");
7 Iterator<String> iterator = all.iterator();
8 while (iterator.hasNext()){
9 String str = iterator.next();
10 if("World".equals(str)){
11 iterator.remove(); //删除当前的数据
12 }else {
13 System.out.println(str);
14 }
15 }
16 }
17 }
--解释Collection.remove()与Iterator.remove()区别?
在进行迭代输出的时候,如果使用了Collection中的remove()则会造成并发更新的异常,导致程序异常中断,使用Iterator.remove()则可以实现正常的删除处理.
三.ListIterator输出
使用Iterator进行的迭代输出由一个特点:只允许由前向后实现输出,二如果说想在要进行双向迭代处理,那么就必须依靠Iterator的子接口,ListIterator接口来实现,但是在Collection中,并没有定义任何可以获得ListIterator的方法.如果想要获取ListIterator接口对象,可以发现在List子接口中定义了这个方法,也就是说这个输出的接口是专门为List集合准备的.
--在ListIterator接口中定义有如下的方法:
判断是否有前一个元素: boolean hasPrevious()
获取当前元素: E previous()
--范例:实现双向迭代:
1 public class ListIteratorDemo {
2 public static void main(String[] args) {
3 List<String> all = new ArrayList<>();
4 all.add("Hello");
5 all.add("World");
6 all.add("test");
7 ListIterator<String> iterator = all.listIterator();
8 System.out.println("由前向后输出:");
9 while (iterator.hasNext()){
10 System.out.println(iterator.next());
11 }
12 System.out.println("由后向前输出:");
13 while (iterator.hasPrevious()){
14 System.out.println(iterator.previous());
15 }
16 }
17 }
--运行结果
由前向后输出:
Hello
World
test
由后向前输出:
test
World
Hello
Process finished with exit code 0
--如果要想实现由后向前的遍历,那么首先要实现的是由前向后实现遍历.
四.Enumeration输出
Enumeration是在JDK1.0的时候就是用的输出接口,这个输出接口主要是为了Vector类提供服务的,一直到后续的JDK的发展,Enumeration依然只为Vector一个类服务,如果要想获取Enumeration接口对象,就必须依靠Vector类提供的方法:
获取Enumeration类对象 public Enumeration<E> elements();
--在Enumeration接口之中,定义有两个接口方法:
判断是否有下一个元素: boolean hasMoreElements()
获取当前元素: E nextElement()
--范例:使用Enumeration实现输出:
1 public class MyEnumerationDemo {
2 public static void main(String[] args) {
3 Vector<String> all = new Vector<>();
4 all.add("Hello");
5 all.add("World");
6 all.add("test");
7 Enumeration<String> elements = all.elements();
8 while (elements.hasMoreElements()){
9 String str = elements.nextElement();
10 System.out.println(str);
11 }
12 }
13 }
--运行结果
Hello
World
test
Process finished with exit code 0
--由于该接口出现的时间比较长了,所以在一些比较早的开发过程中,也有部分的方法只支持Enumeration的输出操作,但是随着类方法的不断完善,大部分的操作都可以直接利用Iterator来实现.
五.foreach输出
输了使用迭代接口实现输出之外,从JDK1.5开始,加强型的for循环也可以实现集合的输出了.这种输出的形式与数组的输出操作形式类似.
--范例:使用foreach的遍历输出:
public class MyEnumerationDemo {
public static void main(String[] args) {
Vector<String> all = new Vector<>();
all.add("Hello");
all.add("World");
all.add("test");
for (String s : all) {
System.out.println(s);
}
}
}
--这种输出最初出现的时候很多人并比建议使用,因为标准的集合操作还是应该以Iterator为主,但是JDK1.5之后,很多的语法也开始被大多数人所习惯,