zoukankan      html  css  js  c++  java
  • 集合的输出

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

  • 相关阅读:
    大数据-hive理论(2)DDL
    大数据-hive理论(1)基础,原理,安装
    大数据-hbase理论
    java-多线程与锁
    java-自定义注解
    java-filebeat+elk的数据传输
    java-es查询
    java-创建完整的springCloud项目
    【从零单排】详解 Log4j + Slf4j 等日志框架(上篇)
    IntelliJ 中 Git 报错 Could not read from remote repository
  • 原文地址:https://www.cnblogs.com/skykuqi/p/11447532.html
Copyright © 2011-2022 走看看