温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

什么是集合输出

发布时间:2021-10-13 09:20:23 来源:亿速云 阅读:110 作者:iii 栏目:编程语言

这篇文章主要介绍“什么是集合输出”,在日常操作中,相信很多人在什么是集合输出问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是集合输出”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

集合输出

集合输出实际上从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接口对象:public Iterator<T> iterator();

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

No.方法名称类型描述
01public boolean hasNext()普通判断是否有数据
02public E next()普通取出当前数据
03default void remove()普通删除

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

什么是集合输出
Iterator接口

范例:使用Iterator输出

import java.util.Set;import java.util.Iterator;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {Set<String> all = Set.of("Hello", "World", "MLDN");Iterator<String> iter = all.iterator();   //实例化Iterator接口对象while (iter.hasNext()) {String str = iter.next();
            System.out.println(str);   // World Hello MLDN}
    }
}

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

import java.util.Set;import java.util.Iterator;import java.util.HashSet;public class JavaAPIDemo {public static void main(String[] args) throws Exception {Set<String> all = new HashSet<String>();all.add("Hello");all.add("World");all.add("MLDN");
        Iterator<String> iter = all.iterator();   //实例化Iterator接口对象while (iter.hasNext()) {
            String str = iter.next();if ("World".equals(str)) {all.remove("World");  //Collection集合方法
            }else {System.out.println(str);   //  Hello   Exception in thread "main">

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

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

import java.util.Set;import java.util.Iterator;import java.util.HashSet;public class JavaAPIDemo {public static void main(String[] args) throws Exception {
        Set<String> all = new HashSet<String>();
        all.add("Hello");
        all.add("World");
        all.add("MLDN");
        Iterator<String> iter = all.iterator();   //实例化Iterator接口对象while (iter.hasNext()) {String str = iter.next();if ("World".equals(str)) {
                iter.remove();  //Collection集合方法}else {
                System.out.println(str);   //  Hello   Exception in thread "main" java.util.ConcurrentModificationException}
        }
        System.out.println("*** "+ all);  
    }
}//Hello//MLDN//*** [Hello, MLDN]

此时程序执行后没有出现任何的错误,并且可以成功的删除原始集合中的数据。
面试题:
请解释Collection.remove()与Iterator.remove()的区别?
在进行迭代输出的时候,如果使用了Collection.remove()则会造成并发更新的异常,导致程序删除出错,而此时只能够利用Iterator接口中remove()方法实现正常的删除处理。

ListIterator双向迭代输出

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

什么是集合输出
ListIterator接口

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

判断是否有前一个元素:public boolean hasPrevious()
获取当前元素:public 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<String>();all.add("Hello");all.add("World");all.add("MLDN");
        ListIterator<String> iter = all.listIterator();System.out.print("由前向后输出:");while (iter.hasNext()) {System.out.print(iter.next() + "、");
        }System.out.print("\n由后向前输出:");   //由前向后输出:Hello、World、MLDN、while (iter.hasPrevious()) {System.out.print(iter.previous() + "、");  //由后向前输出:MLDN、World、Hello、
        }      
    }
}

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

Enumeration输出

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

获取Enumeration:public Enumeration<E> elements()
在Enumeration接口中定义有两个操作方法:
判断是否有下一个元素:public boolean hasMoreElements()
获取当前元素:public 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<String>();
        all.add("Hello");
        all.add("World");
        all.add("MLDN");
        Enumeration<String> enu = all.elements();while (enu.hasMoreElements()) {String str = enu.nextElement();
            System.out.print(str +"、");    //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 str : all){
            System.out.print(str+"、");   //Hello、World、MLDN、}     
    }
}

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

到此,关于“什么是集合输出”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

jdk
AI