集合的输出

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

上一篇:Python3 – 将枚举转换为不同的数据类型


下一篇:关于Java中的集合,枚举和迭代器的困惑