集合输出

作者: 江湖非良人 | 来源:发表于2019-08-06 00:04 被阅读22次

  集合输出实际上从JDK1.8开始就在Iterable接口中提供了一个forEach()方法,但是这种方法输出并不是传统意义上集合输出形式,并且也很难再实际的开发中出现,对于集合操作而言,一共定有四种输出形式:Iterator迭代输出(95%)、ListIterator双向迭代输出(0.1%)、Enumeration枚举输出(4.9%)、foreach输出(与Iterator相当)。

Iterator迭代输出

  通过Collection接口的继承关系可以发现,从JDK1.5开始其多继承了一个Iterable父接口,并且在这个接口中定义有一个Iterator()操作方法,通过此方法可以获取Iterator接口对象(在JDK1.5前,这一方法直接定义在Collection接口中)。

  • 获取Iterator接口对象:Iterator<E> iterator()

在Iterator接口中定义有如下的方法:

  • 判断是否有数据:boolean hasNext()
  • 取出当前数据:E next()
  • 删除:default void remove()

  在之前使用的java.util.Scanner类就是Iterator接口的子类,所以此时类的继承关系如下:

范例:使用Iterator输出

import  java.util.Iterator;
import java.util.Set;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Set<String> all=Set.of("hello","world","mldn");
        Iterator<String> it = all.iterator();
        while (it.hasNext()){
            String str=it.next();
            System.out.print(str+"、");//hello、world、mldn、
        }
    }
}

  但是对于Iterator接口中的remove()方法的使用需要特别注意一下(如果不是必须不要使用)。实际上在Collection接口中定义有数据的删除操作方法,但是在进行迭代输出的过程中如果你使用了Collection中的remove()方法会导致迭代失败。
范例:采用Collection集合中remove()方法删除

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Set<String> all=new HashSet();
        all.add("hello");
        all.add("world");
        all.add("mldn");
        Iterator<String> it = all.iterator();
        while (it.hasNext()){
            String str=it.next();
            if("mldn".equals(str)){
                all.remove(str);
            }else {
                System.out.print(str+"、");
            }
        }
    }
    //world、Exception in thread "main" java.util.ConcurrentModificationException
}

此时无法进行数据删除处理操作,那么此时就只能够利用Iterator接口中的remove()方法删除。

范例:使用Iterator接口删除方法

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Set<String> all=new HashSet();
        all.add("hello");
        all.add("world");
        all.add("mldn");
        Iterator<String> it = all.iterator();
        while (it.hasNext()){
            String str=it.next();
            if("mldn".equals(str)){
                it.remove();
            }else {
                System.out.print(str+"、");
            }
        }
        System.out.println("\n***"+all);
        //world、hello、
        //***[world, hello]
    }
}

此时程序执行后没有出现任何的错误,并且可以成功的删除原始集合中的数据。

ListIterator输出

  使用Iterator进行的迭代输出操作有一个特点:只允许由前向后输出,而如果现在需要进行双向迭代处理,那么就必须依靠Iterator的子接口:ListIterator接口来实现了。需要注意的是,如果想要获取ListIterator接口对象,Collection接口中并没有定义相关的处理方法,但是List子接口有,也就是说这个输出的接口是专门为List集合准备的。

  ListIterator接口中定义有如下的操作方法:

  • 判断是否有前一个元素:boolean hasPrevious()
  • 获取当前元素:E previous()

范例:实现双向迭代

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        List<String> all = new ArrayList();
        all.add("hello");
        all.add("world");
        all.add("mldn");
        ListIterator<String> it = all.listIterator();
        System.out.print("由前向后输出:");
        while (it.hasNext()) {
            System.out.print(it.next() + "、");
        }
        //由前向后输出:hello、world、mldn、
        System.out.print("\n由后向前输出:");
        while (it.hasPrevious()) {
            System.out.print(it.previous() + "、");
        }
        //由后向前输出:mldn、world、hello、
    }
}

如果想实现由后向前的遍历,那么首先要实现的是由前向后实现遍历处理。

Enumeration输出

  Enumeration是在JDK1.0时就使用的输出接口,这个输出接口主要是为了Vector类提供服务的,一直到后续的JDK的发展,Enumeration依然只为Vector一个类服务,所以想要获取Enumeration接口对象,那么必须依靠Vector类提供的方法:

  • 获取Enumeration:public Enumeration<E> elements()

  在Enumeration接口中定义有两个操作方法:

  • 判断是否有下一个元素:boolean hasMoreElements()
  • 获取当前元素:E nextElement()

范例:使用Enumeration实现输出

import java.util.Enumeration;
import java.util.Vector;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Vector<String> all = new Vector();
        all.add("hello");
        all.add("world");
        all.add("mldn");
        Enumeration<String> es = all.elements();
        while (es.hasMoreElements()) {
            System.out.print(es.nextElement()+"、");
        }
        //hello、world、mldn、
    }
}

由于该接口出现的时间比较长了,所以在一些比较早的开发过程中,也有部分的方法支持Enumeration输出操作,但随着类方法的不断完善,大部分的操作都能直接利用Iterator实现了。

foreach输出

  除了使用迭代接口实现输出之外,从JDK1.5开始加强型for循环也可以实现集合的输出了。这种输出的形式与数组的输出操作形式类似。
*范例:使用foreach输出

import java.util.ArrayList;
import java.util.List;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        List<String> all = new ArrayList<String>();
        all.add("hello");
        all.add("world");
        all.add("mldn");
        for (String string : all){
            System.out.print(string+"、");
        }
        //hello、world、mldn、
    }
}

这种输出最初出现时很多人并不建议使用,因为标准的集合操作还是以Iterator为主,但是毕竟JDK1.5都已经推出十多年了,很多语法也开始被大部分人所习惯。

相关文章

  • 集合输出

      集合输出实际上从JDK1.8开始就在Iterable接口中提供了一个forEach()方法,但是这种方法输出并...

  • python set集合,排序输出

    python set集合,排序输出 列表-->集合-->列表-->list sort() == 集合-->列表--...

  • 输出集合的所有子集

    题目:输入一个集合,输出他的子集举例:输入集合[1,2],输出它的所有子集为[[], [1], [2], [1, ...

  • Python中对象在集合set()的剔重

    集合set剔重 输出结果为:

  • Set

    集合(set)也是元素的集合。集合中不允许有等值的元素(也就是元素不能重复),集合的元素没有顺序: 输出: 因为 ...

  • Collections类中的方法

    addAll 往集合中添加多个元素 shuffle 打乱集合的顺序 输出结果 sort 将集合中的元素按照默认方法...

  • Gradle教程系列 —— 增量构建

    内置任务(如JavaCompile)声明了输入集合(Java源文件)和输出集合(class文件)。Gradle使用...

  • Python基本语法

    字符串 输出结果为 列表 输出结果为 集合 输出结果为 列表推导式 输出结果为 zip 输出结果为 可命名元组:n...

  • java面试Iterator相关

    面试题目一:请问如下代码输出结果是什么? 答案:会输出[world]。该题目考察的是集合底层是数组,对于集合的re...

  • 集合(一)~集合概述、List

    List集合序列排序方法①集合中是简单整型 输出为:1 2 3②集合中为对象 实体类要实现Comparable接口...

网友评论

    本文标题:集合输出

    本文链接:https://www.haomeiwen.com/subject/ylfbdctx.html