一.集合的输出
集合输出实际上从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之后,很多的语法也开始被大多数人所习惯,