首页 > 编程语言 >Java拾贝第十五天——集合之Iterator迭代器

Java拾贝第十五天——集合之Iterator迭代器

时间:2023-11-03 14:26:39浏览次数:48  
标签:Java 拾贝 Iterator list add 集合 iterator 第十五天 迭代

虽然for each循环可以遍历集合输出,但书上提及了一个观点。

只要碰到了集合输出的操作,就一定要使用Iterator(迭代器)接口

实际上编译器把for each循环通过Iterator改写为了普通的for循环

上述的观点在本文最后一部分会提及。

Iterator

Iterator是专门的迭代输出接口,所谓迭代就是将元素一个个进行判断,判断是否有内容,如果有则把内容取出:
image

Iterator接口定义如下:

public interface Iterator<E>

也使用了泛型,当然迭代器的泛型需要和集合指定的泛型相同。

Iterator内部定义了三个方法:

方法 类型 描述
boolean hasNext() 普通方法 判断是否有下一个值
E next() 普通方法 取出当前元素
void remove() 普通方法 移除当前元素

接口中的方法默认公开抽象 public abstract

如何实例化Iterator()

在Collection接口中定义了Iterator()方法为某集合实例化一个迭代器。

既然Collection接口中存在了此方法,那么List接口和Set接口的实现类也可也使用该方法调用迭代器。

boolean hasNext() 和 E next()

判断是否有下一个值 和 取出当前元素
栗子:

    public static void main(String[] args) {
        List<String> list=new ArrayList<>();
        list.add("你好");
        list.add("嗨咯");
        list.add("hello");
        list.add("hi");

        Iterator<String> iterator = list.iterator();//返回一个迭代器实例
        while (iterator.hasNext()){
            System.out.println(iterator.next());//输出当前元素
        }
    }

程序运行结果:

你好
嗨咯
hello
hi

void remove()

删除当前元素
栗子:

    public static void main(String[] args) {
        List<String> list=new ArrayList<>();
        list.add("你好");
        list.add("嗨咯");
        list.add("hello");
        list.add("hi");

        Iterator<String> iterator = list.iterator();//返回一个迭代器实例
        while (iterator.hasNext()){
            String temp =iterator.next();//拿一个变量接收当前对象

            if (temp.equals("hi")){
                iterator.remove();//删除hi
            }else {
                System.out.println(temp);
            }
        }
    }

程序运行结果:

你好
嗨咯
hello

注意
此时调用的是迭代器里的remove()方法。

如果在迭代器输出时用集合对象remove()方法会导致异常:

栗子:

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("你好");
        list.add("嗨咯");
        list.add("hello");
        list.add("hi");

        Iterator<String> iterator = list.iterator();//返回一个迭代器实例
        while (iterator.hasNext()) {
            String temp = iterator.next();//拿一个变量接收当前对象
            if (temp.equals("hi")) {
                list.remove(temp);
            } else {
                System.out.println(temp);
            }
        }
    }

程序运行结果:

你好
嗨咯
hello
Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:911)
	at java.util.ArrayList$Itr.next(ArrayList.java:861)
	at moudle2.Test15.main(Test15.java:17)

Process finished with exit code 1

因为此时集合本身被破坏了,迭代出现错误。

为什么一定要使用Iterator?

因为使用for循环进行遍历集合需要知道集合的内部构造。

如果遍历有序集合,直接使用下标即可。
如果遍历无序集合,无法像有序集合一样使用下标进行遍历。

所以使用迭代器的好处就是不用知道集合的内部构造。
一种方式针对多种集合,万金油的遍历方式。

标签:Java,拾贝,Iterator,list,add,集合,iterator,第十五天,迭代
From: https://www.cnblogs.com/Ocraft/p/17807480.html

相关文章

  • 每天5道---Java⾯试题(第一天)
    第⼀章:Java基础1.1、⾯向对象的三个基本特征?⾯向对象的三个基本特征是:封装、继承和多态。继承:让某个类型的对象获得另⼀个类型的对象的属性和⽅法。继承就是⼦类继承⽗类的特征和⾏为,使得⼦类对象(实例)具有⽗类的实例域和⽅法,或⼦类从⽗类继承⽅法,使得⼦类具有⽗类相同的⾏为。......
  • JAVA之反射机制
    反射的JAVA的一个重要的机制静态语言:在编译期间检查类型,所有的类型检查发生在编译时。变量的类型在编译时是已知的,不会随着程序运行时期的变化而变化。典型的静态语言包括Java、C#、C++等。动态语言:在运行时检查类型,类型检查发生在运行时。变量的类型可以在运行时随程序的执......
  • Java学习之路(四)
    Java学习之路(四)1、方法的概念​ 方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集注意:方法必须先创建才可以使用,该过程成为方法定义方法创建后并不是直接可以运行的,需要手动使用后,才执行,该过程成为方法调用2、方法的定义和调用2.1、无参......
  • jar包的精细化运营,Java模块化简介 | 京东云技术团队
    图:模块化手机概念一、什么是Java模块化Java模块化(module)是Java9及以后版本引入的新特性。官方对模块的定义为:一个被命名的,代码和数据的自描述集合。(themodule,whichisanamed,self-describingcollectionofcodeanddata)。早在Java7的时候就被提出,但由于其复杂性,不断跳票,直......
  • Java 8: 异步利器 CompletableFuture vs Parallel Stream 选哪个
    应人们对性能和体验的要求,异步在项目中用的越来越多,CompletableFuture和ParallelStream无疑是异步并发的利器。既然两者都可以实现异步并发,那么带来一个问题:什么时候该使用哪个呢,哪个场景下使用哪个会更好呢?这篇文章因此出现,旨在当执行异步进行编程时CompletableFuture与Parall......
  • APK检测管理系统 JAVA开源项目 毕业设计
    https://gf.bilibili.com/item/detail/1104293029为了帮助小白入门Java,博主录制了本项目配套的《项目手把手启动教程》,希望能给同学们带来帮助。一、摘要基于JAVA+Vue+SpringBoot+MySQL的APK检测管理系统,包含了软件档案模块、软件检测模块、软件举报模块、开放平台模块,还包含系统......
  • JAVA技术栈的有福啦!这款IDEA插件,写完代码即可调试
    国产API调试工具Apipost推出IDEA插件,写完代码就可以调试接口并一键生成接口文档!而且还可以根据已有的方法帮助您快速生成url和params。ApipostHelper=API调试工具+API管理工具+API搜索工具。在商店中搜索或直接点击下方链接即可下载:https://plugins.jetbrains.com......
  • JAVA技术栈的有福啦!这款IDEA插件,写完代码即可调试
    国产API调试工具Apipost推出IDEA插件,写完代码就可以调试接口并一键生成接口文档!而且还可以根据已有的方法帮助您快速生成url和params。ApipostHelper=API调试工具+API管理工具+API搜索工具。在商店中搜索或直接点击下方链接即可下载:https://plugins.jetbrains.com/p......
  • Java面试题:链表-合并两个排序的链表
    描述输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。示例输入:{1,3,5},{2,4,6}返回值:{1,2,3,4,5,6}原题地址:https://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337代码实现packagecom.example.demo.linked;......
  • java基础学习:path,java_home环境变量配置
    1.path变量: 装jdk后会自动配置java和javac的path路径 2.JAVA_HOME环境变量:   ......