11_3、Java集合之迭代器Iterator接口

news2024/9/22 6:03:02

一、引入

Iterator对象称为迭代器(设计模式的一种),主要用于遍历 Collection 集合中的元素。 GOF给迭代器模式的定义为:提供一种方法访问一个容器(container)对象中各个元 素,而又不需暴露该对象的内部细节。迭代器模式,就是为容器而生。类似于“公 交车上的售票员”、“火车上的乘务员”、“空姐”。

Collection接口继承了java.lang.Iterable接口,该接口有一个iterator()方法,那么所 有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了 Iterator接口的对象。

Iterator 仅用于遍历集合, 集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合 的第一个元素之前。

Iterator接口的方法:

二、遍历Collection集合的两种方式

1、遍历Collection的两种方式:

①Iterator迭代器 ②foreach循环

2、java.utils包下定义的迭代器接口:Iterator

2.1作用:遍历Collection接口集合

2.2如何获取实例:

list.iterator();返回一个Iterator实例

Iterator iterator = coll.iterator();

        Iterator iterator = coll.iterator();
        //方式一:不推荐
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
        //报异常:NoSuchElementException
//        System.out.println(iterator.next());

        //方式二:不推荐
//        for (int i = 0; i < coll.size(); i++) {
//            System.out.println(iterator.next());
//        }
        //方式三:推荐
        //hasNext():判断是否还有下一个元素
        while(iterator.hasNext()){
            //next():①指针下移 ②将下移以后集合位置上的元素返回
            System.out.println(iterator.next());
        }

2.3、常用方法:remove()、hasNext()、next()

/*
remove()方法测试:如果还未调用next()或在上一次调用 next 方法之后已经调用了 remove 方法,再调用remove都会报IllegalStateException。
*/
    @Test
    public void test3(){
        Collection coll = new ArrayList();

        coll.add(123);
        coll.add(456);
        coll.add(new String("Tom"));
        coll.add(false);
        coll.add(new Person("Jerry",20));

        Iterator iterator = coll.iterator();

        while(iterator.hasNext()){
            Object o = iterator.next();
//            iterator.remove();
            if("Tom".equals(o)){
                iterator.remove();
//                iterator.remove();
            }
        }

        iterator = coll.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

注意:在调用it.next()方法之前必须要调用it.hasNext()进行检测。若不调用,且 下一条记录无效,直接调用it.next()会抛出NoSuchElementException异常。

2.4、图示说明

3、增强for循环:(foreach循环)

3.1、Java 5.0 提供了 foreach 循环迭代访问 Collection和数组。

①遍历集合的底层调用Iterator完成操作。

②遍历操作不需获取Collection或数组的长度,无需使用索引访问元素。

③foreach还可以用来遍历数组。

3.2、遍历集合举例

    @Test
    public void test1(){
        Collection coll = new ArrayList();

        coll.add(123);
        coll.add(456);
        coll.add(new String("Tom"));
        coll.add(false);
        coll.add(new Person("Jerry",20));

        //for(集合对象存储元素的类型 局部变量 : 集合对象名){}
        //内部仍然调用了迭代器
        for(Object obj : coll){
            System.out.println(obj);
        }
    }

3.3、遍历数组举例

    @Test
    public void test2(){
        int[] arr = new int[]{1,2,3,4,5,6};
        //for(数组对象存储元素的类型 局部变量 : 数组对象名){}
        for(int i : arr){
            System.out.println(i);
        }
    }

3.4、关于增强for循环的小练习

@Test
    public void test3(){
        //练习题

        String[] arr = new String[]{"MM","MM","MM"};

        //普通for(){}结构
//        for (int i = 0; i < arr.length; i++) {
            arr[i] = "GG";
        }

        //增强for(){}
        for(String s : arr){
            s = "GG";
        }

        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }

    }

思考:使用普通for循环和增强for循环对于最后输出的结果有什么影响?

结论:增强for循环不会影响原有数组或集合内部元素的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华脉智联铁路巡检及指挥调度系统

技术方案 整套系统基于云通讯平台和智能终端的结合&#xff0c;实现指挥中心和现场人员的实时互动&#xff0c;同时保证现场取证材料的实时上报以及指挥中心实时将决策及命令下发到现场人员。提高巡检效率及巡检准确性。 方案拓扑如下&#xff1a; 在指挥中心通信机房部署指挥…

k8s集群监控cadvisor+prometheus+grafana部署

目录 1.新建命名空间monitor 2.部署 2.1部署cadvisor 2.2部署node_exporter 2.3部署prometheus资源 2.4部署rbac权限 2.5.部署 metrics 2.6部署grafana 3.测试效果 参考文章&#xff1a; k8s集群部署cadvisornode-exporterprometheusgrafana监控系统 - cyh00001 - 博客园 …

JDBC --- 数据库连接池 C3P0

目录 1、基本定义 2、使用C3P0&#xff08;数据库连接池&#xff09;的必要性 2.1.JDBC传统模式开发存在的主要问题 2.1.1时间和内存资源消耗巨大 2.1.2 有内存泄漏的风险 3、数据库连接池的详细说明 4、使用连接池的明显优势 4.1.资源的高效利用 4.2.更快的系统反应速…

linux中awk命令和argxs命令的详解使用

一 awk命令1.1 命令的作用awk为行命令处理器&#xff0c;对每一行的文本数据&#xff0c;进行格式化文本信息。目的&#xff1a;在处理庞大文件时不会出现内存溢出或是处理缓慢的问题。1.2 案例应用获取某一行文本数据&#xff0c;提取不同字段的值。1.显示整行数据[rootlocalh…

怎么把照片合成一张?看完这篇文章你就知道了

大家平时有没有遇到过这样的情况&#xff1f;好朋友们组团一起出去玩&#xff0c;但是你因为个人原因无法跟大家一起去。这就可能导致姐妹中的合照少了你一个人&#xff0c;那么要怎样在图片上添加你去了的效果呢&#xff1f;其实很简单&#xff0c;只要编辑图片进行合成就可以…

指针进阶(1)

( )> [ ] > -> > -- > . > * &#xff08;优先级比较&#xff09; tips 1. &#xff08;全是笔者个人自己总结&#xff0c;仅供参考&#xff0c;随意取用&#xff09; 2. 3. 地址唯一标识一块内存空间 4. printf%s打印字符串的话只要给一个起始地址…

【 Vue3 + Vite + setup语法糖 + Pinia + VueRouter + Element Plus 第二篇】(持续更新中)

在第一篇中我们讲述了Vue3框架的搭建以及Vue3的常用语法&#xff0c;这篇文章将使用 Axios 和 Element Plus 并使用封装组件的方式完成表格搭建。 本期需要掌握的知识如下: 引入并封装 Axios 请求配置 .env 文件通过 api 接口获取数据 下期需要掌握的知识如下: 组件的封装和…

MySQL主从延迟的解决方案

1、MySQL主从延迟的解决方案 之前项目中基于 MySQL 主从复制以及 AOP 的方式实现了读写分离&#xff0c;也写了博客记录了这个实现过程。既然配置了 MySQL 主从复制&#xff0c;那么自然会存在主从延迟&#xff0c;如何尽可能减小主从延迟对应用系统的影响是很有必要的思考点&a…

特征工程原理(一)

一、定义 在机器学习原理中讲过机器学习的基本流程&#xff0c;其中很重要的一个环节就是特征工程。 1.1 基本概念 特征工程&#xff08;Feature Engineering&#xff09;&#xff1a;从原始数据中提取特征的过程&#xff0c;这些特征可以很好地描述数据&#xff0c;并且利用…

Showdoc升级版本记录

目录 Showdoc介绍 升级步骤 1.备份当前版本 2.下载安装最新版本 总结步骤&#xff1a; Showdoc介绍 ShowDoc是一个非常适合IT团队的在线API文档、技术文档工具。通过showdoc&#xff0c;你可以方便地使用markdown语法来书写出美观的API文档、数据字典文档、技术文档、在线…

GitHub创建仓库,使用SSH建立连接(github创建仓库,github使用SSH建立连接)

GitHub简介&#xff1a;GitHub是一个面向开源及私有软件项目的托管平台&#xff0c;也是一个开源代码库以及版本控制系统&#xff0c;Github拥有超过900万开发者用户&#xff0c;已经成为了管理软件开发以及发现已有代码的首选方法。 怎样创建仓库并使用&#xff1f;详细操作步…

FTP错误代码

本文迁移自本人网易博客&#xff0c;写于2015年4月15日&#xff0c;FTP错误代码 - lysygyy的日志 - 网易博客 (163.com)1、12003错误指定用户未添加到有权限的组中&#xff1b;即指定用户没有权限。2、CFtpFileFind.FindFile GetLastError 12110 &#xff08;1&#xff09;当递…

对比学习综述

一 . 发展历程大概可以分为四个阶段 1、百花齐放&#xff1a;在这个阶段中&#xff0c;方法、模型、目标函数、代理任务都还没有统一&#xff0c;所以说是一个百花齐放的时代。 InstDisc&#xff08;instance discrimination&#xff09;CPCCMC 2、CV双雄&#xff1a;这个阶…

十六、xml、单元测试、注解、单例模式

xml 1.概述【理解】 万维网联盟(W3C) 万维网联盟(W3C)创建于1994年&#xff0c;又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。 建立者&#xff1a; Tim Berners-Lee (蒂姆伯纳斯李)。 是Web技术领域最具权威和影响力的国际中立性技术标准机构。 到目前为止&…

新提案,初识CSS的object-view-box属性

在开发时&#xff0c;一直希望有一种原生的css方式来裁剪图片&#xff0c;并将其定位在我需要的任何方向。这可以通过使用一个额外的html元素和不同的CSS属性来实现&#xff0c;后面解释。在这篇文章中&#xff0c;将带领大家了解Jake Archibald在今年年初提出的新的CSS属性obj…

VisionBank AI实现4项技术突破----传统算法融合深度学习,重新定义“工业视觉检测大脑”

机器视觉经过长时间的发展&#xff0c;技术不断取得重大突破并被广泛应用&#xff0c;当前已遍布工业生产的各个环节。而且机器视觉易于实现自动化集成&#xff0c;软件集成&#xff0c;是实现智能制造的基础技术。据统计&#xff0c;中国的机器视觉市场需求近几年处于持续高速…

【目标检测】ROI Pool和ROI Align的区别

这里说一下ROI Pool和ROI Align的区别&#xff1a; 一、ROI Pool层 参考Faster RCNN中的ROI Pool层&#xff0c;功能是将不同size的ROI区域映射到固定大小的feature map上。 它的缺点&#xff1a;由于两次量化带来的误差&#xff1b; 将候选框边界量化为整数点坐标值将量化…

【Vue】后台管理系统

O 项目说明 1.脚手架 vitevue-cli 》 webpack 2.vite脚手架使用 官网&#xff1a;https://vitejs.cn/ Vue3 vite官网&#xff1a;https://cn.vitejs.dev/ Vite下一代的前端工具链&#xff0c;为开发者提供急速响应 # 安装 $ cnpm i vite -g $ vite -v vite/4.0.3 darwin…

Sentinel + Redis + Mysql + RabbitMQ 秒杀功能设计及后端代码实现

文章目录前言数据一致性高性能动静分离静态资源缓存流控缓存数据库消息队列RabbitMQ的优点高并发分布式锁后端代码实现中间件表结构添加依赖公共常量实体类Redission配置定时任务Controller下单接口付款接口接收通道消息完整代码前言 在开发秒杀系统功能的时候&#xff0c;需要…

MyBatis讲解,批量添加

一、批量添加 1.书写BookMapper 1.1先在navicat的新建查询里书写条件查询的sql语句 条件查询的sql语句 insert into book(book_name) values(三体); 1.2将sql语句复制到BookMapper里 用到foreach标签&#xff1b; collection&#xff1a;可以放数组&#xff0c;也可以放list集…