Java迭代器和Collection接口

在这里插入图片描述

  各位小伙伴们大家好,欢迎来到这个小扎扎的《Java核心技术 卷Ⅰ》笔记专栏,在这个系列专栏中我将记录浅学这本书所得收获,鉴于 看到就是学到、学到就是赚到 精神,这波简直就是血赚

💡涉及的知识点速通

  • 🛫 关于迭代器你都知道什么?
    • 🪂 什么是迭代器?
    • 🪂 迭代器的4个API
    • 🪂 如何使用迭代器?
  • 🛫 Collection集合接口知多少?
    • 🪂 为什么不使用数组而是集合?
    • 🪂Collection接口的API都有什么?
    • 🪂AbstractCollection类知多少?

🛫 关于迭代器你都知道什么?

🪂 什么是迭代器?

  所谓迭代的意思就是交换替代,迭代器并不是一种数据结构或者集合,而是可以过迭代器中的方法逐个访问集合中的每个元素的一种方法。提到迭代器最重要的就是Iterator接口,所有想要使用迭代器迭代的结构都需要实现或者继承这个接口

🪂 迭代器的4个API

  Iterator接口包含4个方法,分别是next、hasNext、remove、forEachRemaining,接下来在学习构造器如何使用之前我们先学习一下它的四种方法

  首先一开始构造器中的有一个类似于指针的标志,指在集合中第一个元素的前面,调用构器中的next方法会使这个"指针"的位置后移到第一和二个元素之间,然后返回它跨过的那个元素给构造器,也就是第一个元素,如果"指针"到最后一个元素后面再调用next方法的话就会导致抛出NoSuchElementException

  remove方法则是删除当前元素,可以理解为next方法返回的那个元素,如果调用remove方法之前没有调用next方法或者是使用remove方法删除该元素之后都会导致构造器为空,此时调用remove方法就会导致程序抛出IllegalStateExceptions异常

  hasNext方法就是判断迭代器是否还有可迭代的下一个元素,如果有的话就返回true否则返回false,为了避免上述两种异常,remove方法每次都要配合另外两种方法一起使用,每次调用next方法之前都使用hasNext方法判断一下,避免没有可迭代元素导致的异常,每一次调用remove之前都使用next方法获得元素,避免迭代器为空导致的状态异常

  forEachRemaining方法则可以直接遍历迭代器中的每一个元素并调用方法参数中的Lambda表达式,直到迭代器将集合的元素全部迭代完为止

🪂 如何使用迭代器?

  接下来将结合上面的描述给出一个将集合中的元素全部删除的标准代码,然后再给出两个错误的代码,大家可以在使用迭代器的时候规避一下

正确写法

// 创建一个ArrayList集合
Collection<String> strings = new ArrayList<>();
strings.add("a");
strings.add("b");
strings.add("c");
strings.add("d");// 获得迭代器对象
Iterator<String> iterator = strings.iterator();// 使用while循环迭代集合中元素 使用hasNext方法判断
while (iterator.hasNext()) {// 使用next获取下一个元素iterator.next();// 删除这个元素iterator.remove();// 打印集合中元素System.out.println(strings);
}

错误示范一

// 创建一个ArrayList集合
Collection<String> strings = new ArrayList<>();
strings.add("a");
strings.add("b");
strings.add("c");
strings.add("d");// 获得迭代器
Iterator<String> iterator = strings.iterator();// 使用while循环迭代集合中元素 使用next方法判断下一个元素是否为空
while (iterator.next() != null) {// 输出这个元素System.out.println(iterator.next());
}

  第一个的错误原因:使用next方法判断下一个元素是否为空,这样就会导致"指针"到最后一个元素后面依旧会执行next方法,这样就会导致抛出NoSuchElementException异常;而且next方法每调用一次都会将"指针"向后移动一位,哪怕只是用于if判断。所以程序就会每隔一个元素输出一次,最后抛出NoSuchElementException异常在这里插入图片描述错误示范二

// 创建一个ArrayList集合
Collection<String> strings = new ArrayList<>();
strings.add("a");
strings.add("b");
strings.add("c");
strings.add("d");// 获取迭代器对象 并使用while循环迭代集合中元素 使用hasNext方法判断
while (strings.iterator().hasNext()) {// 获取迭代器对象 并使用next获取下一个元素 然后输出System.out.println(strings.iterator().next());
}

  第二个的错误原因:每使用iterator方法获得一次集合对应的迭代器对象,都会默认将"指针"放到第一个元素的前面,于是第二个错误示范中一直使用集合中的第一个元素"a"进行判断有没有下一个元素,所以会导致程序陷入死循环,循环体里也会一直创建结合的迭代器对象,并将"指针"放到第一个元素的前面,然后调用next方法输出元素"a"在这里插入图片描述

🛫 Collection集合接口知多少?

  集合大体上可以分为两种,一种是单列的Collection集合,一种就是双列的Map集合,所谓的单双列可以理解为元素中数据的个数,单列集合一个数据作为元素存储,双列集合两个具有映射关系的数据作为元素存储。这一篇我们先学习Collection集合接口的内容,Collection集合按照元素存储是否有序又可分为List集合、Set集合

  前面之所以先学习Iterator接口的原因就是,Collection接口继承了Iteator接口,于是它的子接口set和list都可以使用迭代器对集合中的元素进行迭代

🪂 为什么不使用数组而是集合?

  在学习集合之前,我们将存储多个对象或者元素的任务都交给了数组,但是数组存储元素有以下缺点:数组一旦初始化之后,长度就确定不可修改,元素个数超出数组长度的话会抛异常。数组中提供的API很少,增加元素需要现将索引后的元素后移空出位置将元素添加进去,删除元素需要删除之后将后面的元素前移将空出来的位置补足,以上操作只能通过代码实现并没有现成的API可以使用。数组存储数据的特点:有序、可重复,对于一些无需、不可重复的业务需求就很难满足

  集合就可以很好的弥补数组的上述缺点,而且集合提供了一组较为完善的数据结构,我们可以根据具体的业务需求来选择具体使用的集合类型。比如说存储元素无序不可重复的Set集合,有序可重复的List集合,具有映射关系的Map集合等

🪂Collection接口的API都有什么?

在这里插入图片描述

🪂AbstractCollection类知多少?

  以上给出的Collection接口中的API都是抽象方法,也就意味着每一个此接口的实现类都需要重写这些抽象方法,实际上Collection接口的直接或者间接实现类有很多,如果每一个都需要重写这些方法的话就会很是麻烦。于是Java类库的设计者提供了AbstractCollection类,该类中只将size方法和Iterator方法声明为抽象,其他方法都提供了默认实现,如果子类不提供这些方法的方法体的话就使用该类中的默认实现
  下图可知,list、set集合的实现类都直接或者间接的继承了AbstractCollection类,为的就是简化重写Collection接口的抽象方法
在这里插入图片描述

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

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

相关文章

atlas安装需要kafka吗_Atlas 2.1.0 实践(2)—— 安装Atlas

在完成Atlas编译以后&#xff0c;就可以进行Atlas的安装了。Atlas的安装主要是安装Atlas的Server端&#xff0c;也就Atlas的管理页面&#xff0c;并确保Atlas与Kafka Hbase Solr等组件的集成。Atlas的系统架构如下&#xff0c;在确保 底层在完成Atlas编译以后&#xff0c;就可以…

ue4中隐藏灯光和相机图标_[HDRP]物理灯光是什么?科普向

HDRP抛弃了Bulitin的灯光&#xff0c;改用物理单位以及物理属性。那么物理灯光到底是什么&#xff1f;请点赞评论来支持作者&#xff0c;提前祝大家新年快乐。https://connect.unity.com/p/hdrp-wu-li-deng-guang-shi-shi-yao-ke-pu-xiang​connect.unity.com同步更新unity con…

私钥经过哈希计算可以产生公钥_「区块链基础概念100」:公钥和私钥 | 027

免责声明&#xff1a;本文旨在传递更多市场信息&#xff0c;不构成任何投资建议。文章仅代表作者观点&#xff0c;不代表火星财经官方立场。小编&#xff1a;记得关注哦投资区块链&#xff0c;猛戳&#xff1a;火星财经App下载来源&#xff1a;学习区块链原文标题&#xff1a;「…

关于List集合类ArrayList、LinkedList、Vector详解

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的《Java核心技术 卷Ⅰ》笔记专栏&#xff0c;在这个系列专栏中我将记录浅学这本书所得收获&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波简直就是血赚 &#x1f4a1;涉及的知识点速通&#x1f6eb; 关于…

1562a检测软件_洛达1562a空间音频版评测!!!

哈喽大家好&#xff01;这里是小泽&#xff0c;一个不专业的Beatboxer~~~今天给大家带来一期HQB最新空间音频版洛达1562a耳机的评测视频&#xff0c;建议先赞再看&#xff01;&#xff08;滑稽&#xff09;听说你不点赞&#xff1f;昨晚拍了一晚&#xff0c;但是因为是第一次搞…

python 趣味编程课_青少年编程:Python趣味编程基础入门课程

课程目录 章节1:编程课前说明试看 课时1 编程课前说明07:49可试看 章节2:第一章 Python基础-认识环境试看 课时2 1、什么是计算机程序和编程&#xff1f;08:48可试看 课时3 2、为什么学习编程&#xff1f;03:10可试看 课时4 3、Python的安装11:48可试看 课时5 4、用Python编写第…

shell181网格划分_ANSYS中Shell181单元介绍谁知道

再毕业设计做模型中要应用到SHELL181单元&#xff0c;那么这个单元有什么好处谁能具体的告诉我下&#xff0c;我有英文但是有的地方翻译不通。或者谁能帮我翻译一下~谢谢~SHELL181issuitableforanalyzingth...再毕业设计做模型中要应用到SHELL181单元&#xff0c;那么这个单元有…

关于Set集合类你都知道什么?来自《卷Ⅰ》的灵魂提问

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的《Java核心技术 卷Ⅰ》笔记专栏&#xff0c;在这个系列专栏中我将记录浅学这本书所得收获&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波简直就是血赚 &#x1f4a1;涉及的知识点速通&#x1f6eb; 关于…

流程图虚线框表示什么_UI设计|APP的交互线框布局设计

一.流程图设计流程图(Flow Chart)&#xff1a;用图示的方式反映出特定主体为了满足特定需求而进行的有特定逻辑关系的一系列操作过程。流程图的四种基本结构&#xff1a;顺序结构&#xff0c;条件结构(又称选择结构)&#xff0c;循环结构&#xff0c;分支结构。1.流程图的常用符…

使用Redis完成商品秒杀业务

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的Redis 6专栏&#xff0c;在这个系列专栏中我对B站黑马的Redis教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;Redis知识点速览&#…

表格列隐藏_【excel每日提升】Excel隐藏列,不让别人打开!

【新朋友】点击标题下面蓝色字“王俊东“关注。 【老朋友】点击右上角&#xff0c;转发或分享本页面内容。excel系列课程excel特效系列课程开始了&#xff0c;今天第2节&#xff01;第1节&#xff1a;Excel有公式的单元格标记颜色&#xff0c;很简单&#xff01;第2节&#xf…

map与weakmap,ES6 Map和WeakMap有什么区别?

Looking this and this MDN pages it seems like the only difference between Maps and WeakMaps is a missing "size" property for WeakMaps. But is this true? Whats the difference between them?解决方案The experienced JavaScript programmer will notice…

“毕业季”|一个java开发实习生的OFFER之路

哈喽哈喽大家好&#xff0c;这里是小扎扎的博客。相信有关注过我的好盆友们可能会发现我已经有一段时间没有出来划水了&#xff0c;那么这段时间小扎扎都在干什么呢&#xff1f;没错&#xff01;我确实是去找实习了&#xff01;接下来就给大家介绍一下本次战役的战况如何 活动地…

virtualbox 该内存不能为written_系统提示“该内存不能为read”的原因和解决办法...

我们单位的电脑经常显示这个对话框&#xff0c;已经有好几年了&#xff0c;单位的老头们都不怎么懂电脑&#xff0c;我本人也不爱管闲事。但是出现这种对话框的原因是什么呢&#xff1f;又怎么解决呢&#xff1f;一般电脑经常出现蓝屏和死机&#xff0c;而且频繁出现。有时会出…

插件properties_Mybatis3系列 - 4. mybatis-config的properties属性详解

前两章简单的讲解了MyBatis的使用方式. 接下来先全局的说一下MyBatis的全局的xml配置详细说明.XML格式定义-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">configuration 的映射文件(根据定义顺序说明)properties 属性…

【Redis 6】秒杀业务——分布式锁

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的Redis 6专栏&#xff0c;在这个系列专栏中我对B站黑马的Redis教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;Redis知识点速览&#…

python读取文件最后几行_如何用python获取文件的最后一行,文件可能会比较大

展开全部 #!/usr/bin/env python import os import sys def get_last_n_lines(logfile, n): blk_size_max 4096 n_lines [] with open(logfile, rb) as fp: fp.seek(0, os.SEEK_END) cur_pos fp.tell() while cur_pos > 0 and len(n_lines) < n: blk_size min(blk_si…

360oauth token是什么意思_Oauth/access token

oauth/access_token第三放应用使用开始的request_token来换取用户授权过的Access_tokenURL格式标准的OAuth http返回格式HTTP请求方式POST请求数限制false请求参数oauth_consumer_key: 创建应用时生成的APP KEY。oauth_token:经过用户授权的Request Token。oauth_signature_met…

【Swagger】看这一篇就够了

各位小伙伴们大家好&#xff0c;欢迎跟着小扎扎一起学习【Swagger】这门技术&#xff0c;在本片博客中我对B站狂神的Swagger教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;Swagger知识点…

python mockito arg_that_wqingxiao

偶然间在脉脉上看到了一道头条的算法面试题按照题目的理解&#xff0c;简单的写了一个html网页pool开始{{index}}{{index}}var vm new Vue({el: #vue_det,data: {list: [],i: 0},methods: {details: function () {return this.site " - 学的不仅是技术&#xff0c;更是梦…