JavaSE——集合1:Collection接口(Iterator和增强for遍历集合)

目录

一、集合框架体系(重要)

二、集合引入

(一)集合的理解与好处

三、Collection接口

(一)Collection接口实现类的特点

(二)Collection接口常用方法

(三)Collection接口遍历元素的方式(Iterator和增强for)

1.使用Iterator(迭代器)

1.1Iterator(迭代器)介绍

1.2Iterator(迭代器)执行原理

1.3Iterator使用

(1)定义一个Student类

(2)创建一个ArrayList集合,并存入多个Student对象与其他元素:

(3)普通打印方式:

(4)使用迭代器遍历集合元素:

(5)迭代器遍历集合快捷键: 

(6)集合遍历完成后,如果再次使用iterator.next()方法,就会报错:

(7)如果想要再次遍历集合,需要对迭代器进行重置:

2.使用增强for循环

3.练习题:使用迭代器和for循环遍历同一个集合


一、集合框架体系(重要)

单列集合:集合中都是单个元素

双列集合:集合中存放的是键值对(K-V)

二、集合引入

(一)集合的理解与好处

        之前我们保存多个数据使用的是数组,但是数组也有不足的地方:

  1. 数组长度在开始时必须指定,而一旦指定,就不能再更改
  2. 数组保存的必须为同一类型的元素
  3. 使用数组进行增加/删除元素比较麻烦

例如:

给Person数组扩容:

Person[] pers = new Person[1];
per[0] = new Person();

给Person数组增加新的Person对象:

Person[] pers2 = new Person[pers.length+1]; // 创建新的Person数组
for(){} // 拷贝pers数组的元素到pers2
pers2[pers.length-1] = new Person(); // 添加新的对象

通过上述代码可以看出,数组扩缩容的灵活度较低,集合可以很好地解决这个问题。


集合的好处:

  1. 可以动态保存任意多个对象,使用比较方便
  2. 集合提供了一系列方便操作对象的方法:add、remove、set、get等
  3. 使用集合添加、删除新元素方便高效

三、Collection接口

(一)Collection接口实现类的特点

public interface Collection<E> extends Iterable<E>
  1. collection实现子类可以存放多个元素,每个元素可以是Object
  2. 有些Collection的实现类,可以存放重复的元素,有些不可以
  3. 有些Collection的实现类,有些是有序的(List),有些无序的(Set)
  4. Collection接口没有直接的实现子类,是通过它的子接口List和Set来实现的

(二)Collection接口常用方法

        因为接口不能被实例化,只有实现了接口的类才能被实例化,所以Collection接口常用的方法,以实现子类ArrayList来演示说明:

  1. add:添加元素

  2. remove:删除某个元素

  3. contains:查找指定元素是否存在

  4. size:返回元素的个数

  5. isEmpty:判断集合是否为空

  6. clear:清空集合中的数据

  7. addAll:添加多个元素

  8. containsAll:查找多个元素是否都存在

  9. removeAll:删除多个元素

public static void main(String[] args) {// 创建ArrayList对象,并用List接口来接收List list = new ArrayList();// 1.add:添加元素list.add("jack");list.add(10); // 相当于:list.add(new Integer(10));list.add(true);System.out.println("list=" + list);// 都采用了自动装箱,list中的元素都是对象,不再是基本数据类型// list=[jack, 10, true]// 2.remove:删除某个元素list.remove(0); // 根据索引删除list.remove("jack"); // 指定删除某个元素System.out.println("list=" + list); // list=[10, true]// 3.contains:查找指定元素是否存在System.out.println(list.contains("jack")); // false// 4.size:返回元素的个数System.out.println(list.size()); // 2// 5.isEmpty:判断集合是否为空System.out.println(list.isEmpty()); // false// 6.clear:清空集合中的数据list.clear();System.out.println("list=" + list); // list=[]// 7.addAll:添加多个元素ArrayList list2 = new ArrayList();list2.add("红楼梦");list2.add("三国演义");list.addAll(list2);System.out.println("list=" + list); // list=[红楼梦, 三国演义]// 8.containsAll:查找多个元素是否都存在System.out.println(list.containsAll(list2)); // true// 9.removeAll:删除多个元素list.add("聊斋");list.removeAll(list2);System.out.println("list=" + list); // list=[聊斋]
}

(三)Collection接口遍历元素的方式(Iterator和增强for)

1.使用Iterator(迭代器)

1.1Iterator(迭代器)介绍

        我们知道,Collection的所有子类都实现了Collection接口,但是Collection接口也继承了Iterable接口

public interface Collection<E> extends Iterable<E>

        Iterable接口有一个非常重要的抽象方法:通过这个iterator()方法,返回一个Iterator(迭代器)接口。通过Iterator接口,可以实现集合中所有元素的遍历。

        因此:凡是实现了Collection接口的子类,都可以获取到iterator()方法,从而获取到Iterator(迭代器)接口,最后实现集合中所有元素的遍历。

        注意:Iterator仅用于遍历集合,本身并不存放对象。

1.2Iterator(迭代器)执行原理

Iterator iterator = coll.iterator();  // 得到一个集合的迭代器

使用iterator的hasNext():判断是否还有下一个元素

while(iterator.hasNext()){

        调用next()方法:1.下移  2.将下移以后的集合位置上的元素返回

        System.out.println(iterator.next());

}

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

1.3Iterator使用
(1)定义一个Student类
class Student {private String name;private String author;private double price;public Student(String name, String author, double price) {this.name = name;this.author = author;this.price = price;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +'}';}
}
(2)创建一个ArrayList集合,并存入多个Student对象与其他元素:
public class CollectionIterator {public static void main(String[] args) {Collection coll = new ArrayList();coll.add(new Student("三国演义", "罗贯中", 41.5));coll.add(new Student("红楼梦", "曹雪芹", 31.58));coll.add(new Student("西游记", "吴承恩", 65.74));coll.add(new Student("水浒传", "施耐庵", 76.24));coll.add("marry");}
}
(3)普通打印方式:
System.out.println("coll=" + coll);
// coll=[Student{name='三国演义', author='罗贯中', price=41.5},
// Student{name='红楼梦', author='曹雪芹', price=31.58},
// Student{name='西游记', author='吴承恩', price=65.74},
// Student{name='水浒传', author='施耐庵', price=76.24}, marry]
(4)使用迭代器遍历集合元素:
// 对coll集合进行遍历:
// 1.先得到coll对应的迭代器
Iterator iterator = coll.iterator();
// 2.使用while循环遍历
while (iterator.hasNext()) {// 返回Object类型是因为集合中可以存放各种类型的数据// 编译类型虽然是Object,但是运行类型还要看集合中真正存放的数据类型Object next = iterator.next();System.out.println(next);
}
/*
Student{name='三国演义', author='罗贯中', price=41.5}
Student{name='红楼梦', author='曹雪芹', price=31.58}
Student{name='西游记', author='吴承恩', price=65.74}
Student{name='水浒传', author='施耐庵', price=76.24}
marry*/
(5)迭代器遍历集合快捷键: 

使用迭代器快捷键 itit + 回车
显示所有快捷键的快捷键:Ctrl + J 

(6)集合遍历完成后,如果再次使用iterator.next()方法,就会报错:
// 当退出while循环后,这时iterator迭代器指向最后的元素
// iterator.next(); // 会抛出NoSuchElementException
(7)如果想要再次遍历集合,需要对迭代器进行重置:
iterator = coll.iterator();
while (iterator.hasNext()) {Object obj = iterator.next();System.out.println(obj);
}

2.使用增强for循环

        增强for循环底层使用的仍然是iterator迭代器,是iterator的简化版。增强for循环只能用于遍历集合或数组。

基本语法:

for(元素类型 元素名 : 集合名或数组名){访问元素
}

代码示例: 

public class CollectionFor {public static void main(String[] args) {Collection coll = new ArrayList();coll.add(new Student("三国演义", "罗贯中", 41.5));coll.add(new Student("红楼梦", "曹雪芹", 31.58));coll.add(new Student("西游记", "吴承恩", 65.74));coll.add(new Student("水浒传", "施耐庵", 76.24));coll.add("marry");// 使用增强for遍历集合for (Object element : coll) {System.out.println(element);}/*** Student{name='三国演义', author='罗贯中', price=41.5}* Student{name='红楼梦', author='曹雪芹', price=31.58}* Student{name='西游记', author='吴承恩', price=65.74}* Student{name='水浒传', author='施耐庵', price=76.24}* marry*/}
}

3.练习题:使用迭代器和for循环遍历同一个集合

public class CollectionExercise {public static void main(String[] args) {// 这里也可以使用List接收,因为接口的多态性// List实现了Collection接口,也可以调用iteratorList list = new ArrayList();list.add(new Dog("斑点狗", 2));list.add(new Dog("哈士奇", 3));list.add(new Dog("阿拉斯加", 1));// 迭代器Iterator iterator = list.iterator();while (iterator.hasNext()) {Object dog = iterator.next();System.out.println(dog);}// 增强forfor (Object dog : list) {System.out.println(dog);}}
}class Dog {private String name;private int age;public Dog(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Dog{" +"name='" + name + '\'' +", age=" + age +'}';}
}

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

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

相关文章

OmniH2O——通用灵巧且可全身远程操作并学习的人形机器人(其前身H2O是HumanPlus的重要参考)

前言 由于我司一直在针对各个工厂、公司、客户特定的业务场景&#xff0c;做解决方案或定制开发&#xff0c;所以针对每一个场景&#xff0c;我们都会反复考虑用什么样的机器人做定制开发 于此&#xff0c;便不可避免的追踪国内外最前沿的机器人技术进展&#xff0c;本来准备…

指针函数C++

指针函数概念 指针函数在C中是一种特殊类型的函数。从本质上讲&#xff0c;它是一个函数&#xff0c;不过其返回值是一个指针类型的数据。例如&#xff0c;像int* plusfunction(int a, int b);这样的函数声明&#xff0c;plusfunction就是一个指针函数&#xff0c;它接受两个i…

【学习笔记】Linux系统基础知识4 —— date命令详解

提示&#xff1a;学习Linux系统基础命令 date 命令详解 一、前期准备 1.已经正确安装并成功进入Linux系统 说明&#xff1a;本实验采用的 Redhat 系统&#xff08;因系统不一致&#xff0c;可能部分显示存在差异&#xff09; 二、学习内容 1、date命令 1. 功能说明 date …

SpringBoot实现电子文件签字+合同系统

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在现代企业中&#xff0c;合同管理和电子文件签字已成为日常运营不可或缺的一部分。为了提升效率和安全性&#xff0c;我们可以使用SpringBoot框架来实现一个电子文件签字和合同管理系统。本文将详细介绍如何…

ITMS-90899: Macs with Apple silicon support issue

文章目录 1.问题2.解决方法2.1 直接忽略这个警告邮件&#xff0c;不会影响app的正常上传2.2 通过在项目的Info.plist文件中加LSMinimumSystemVersion : 12.0 来消除警告 参考链接&#xff1a; 1.问题 ITMS-90899: Macs with Apple silicon support issue - The app isn‘t comp…

机器学习入门(一)

一、机器学习概述 1、人工智能 像人一样智能的综合与分析&#xff0c;机器模拟人类。 是一个系统&#xff0c;像人那样思考&#xff0c;像人那样理性思考。 是一个系统&#xff0c;像人那样活动&#xff0c;像人那样合理的系统 2、机器学习 让机器自动学习&#xff0c;而不…

公司防泄密软件哪个好?6款公司内部文件防泄密软件,2024超好用推荐!

企业的核心机密就如同生命之源&#xff0c;然而&#xff0c;数据泄露的风险也随之而来&#xff0c;让不少企业头疼不已。 面对这一挑战&#xff0c;选择一款高效、可靠的防泄密软件显得尤为重要。 那么&#xff0c;公司防泄密软件哪个好&#xff1f; 接下来&#xff0c;就让我…

posix接口与system V接口及其异同

POSIX接口和System V接口是用于多线程和进程间通信的两种主要编程接口。它们各自有不同的特点、功能和适用场景。以下是对这两种接口的详细介绍及其异同点。 POSIX接口 特点 标准化: POSIX&#xff08;可移植操作系统接口&#xff09;是由IEEE制定的标准&#xff0c;旨在提供统…

​ ​视觉任务大一统!图像生成,编辑,翻译三合一!全能视觉助手PixWizard来袭!

文章链接&#xff1a;https://arxiv.org/pdf/2409.15278 github链接&#xff1a;https://github.com/AFeng-x/PixWizard 亮点直击 任务统一&#xff1a;针对视觉任务的多样性&#xff0c;提出将其框架化为图像到图像的转换问题&#xff0c;并通过后处理将生成的可视化效果转化…

瑞华技术募资额巨降过半:业绩大幅下滑,信用期外应收账款占比高

《港湾商业观察》黄懿 上市的节奏有快有慢&#xff0c;常州瑞华化工工程技术股份有限公司&#xff08;下称“瑞华技术”&#xff0c;920099.BJ&#xff09;自2023年3月被北交所受理后&#xff0c;于2024年8月29日获得注册批文&#xff0c;9月25日正式挂牌上市。 据了解&#…

大学生课程设计报告--基于JavaGUI的贪吃蛇

前言 ​ 贪吃蛇游戏是一个基础且经典的视频游戏,它适合作为学习编程的人进行一些更深入的学习,可以更加了解关于循环,函数的使用,以及面向对象是如何应用到实际项目中的; ​ 不仅如此,贪吃蛇游戏的规则在思考后可以拆分,有利于学生将更多精力去设计游戏的核心逻辑,而…

前端性能优化全面指南

前端性能优化是提升用户体验的关键&#xff0c;页面加载速度、响应时间和交互流畅度直接影响用户的留存率和满意度。以下是常用的前端性能优化方法&#xff0c;从网络层、资源加载、JavaScript 执行、渲染性能等方面进行全方位优化。 减少 HTTP 请求 合并文件&#xff1a;将多…

文献下载/影响因子查询/文献检索/文献翻译平台推荐

文献下载平台 科研通 文献互助平台 - 科研通(AbleSci.com) 每天签到可领10积分&#xff0c;右上角求助文献&#xff0c;一篇10积分&#xff0c;基本实现免费下载。 尽量输入doi&#xff08;类似文献id&#xff09;&#xff0c;如果没有doi则输入标题作者摘要等信息&#xff0…

YOLO11模型推理 | 目标检测与跟踪 | 实例分割 | 关键点估计 | OBB旋转目标检测

前言 本文分享YOLO11的模型推理&#xff0c;检测任务包括物体分类、目标检测与跟踪、实例分割 、关键点估计、旋转目标检测等。 首先安装YOLO11 官方默认安装方式 通过运行 pip install ultralytics 来快速安装 Ultralytics 包 安装要求&#xff1a; Python 版本要求&…

南京大学《软件分析》李越, 谭添——1. 导论

导论 主要概念: soundcompletePL领域概述 动手学习 本节无 文章目录 导论1. PL(Programming Language) 程序设计语言1.1 程序设计语言的三大研究方向1.2 与静态分析相关方向的介绍与对比静态程序分析动态软件测试形式化(formal)语义验证(verification) 2. 静态分析:2.1莱斯…

这个问题做项目的时给某些客户普及过,这里再给你普及一下

有些因素不是地理概念&#xff0c;没错&#xff01;但与地理有关&#xff01;可以通过地理位置将他们链接起来&#xff0c;再结合其它业务数据&#xff0c;完成数据分析&#xff01;例如百度地图会将&#xff1a;餐饮、文化、交通、住宿、甚至价格、天气与位置关联分析&#xf…

超越单线程:Web Worker 在前端性能中的角色

在当今快速发展的数字时代&#xff0c;用户对网页性能的期待已经达到了前所未有的高度&#xff0c;想象一下&#xff0c;当你打开一个网站&#xff0c;瞬间加载、流畅操作&#xff0c;没有任何卡顿和延迟&#xff0c;这种体验无疑会让你倍感惊喜。然而在前端开发中&#xff0c;…

@Service代替@Controller注解来标注到控制层的场景?

在SpringBoot开发中&#xff0c;Controller和Service基本上是日常开发中使用的最频繁的两个注解。但你有没考虑过Service代替Controller注解来标注到控制层的场景&#xff1f;换言之&#xff0c;经过Service标注的控制层能否实现将用户请求分发到服务层的功能&#xff1f; 前言…

【斯坦福CS144】Lab5

一、实验目的 在现有的NetworkInterface基础上实现一个IP路由器。 二、实验内容 在本实验中&#xff0c;你将在现有的NetworkInterface基础上实现一个IP路由器&#xff0c;从而结束本课程。路由器有几个网络接口&#xff0c;可以在其中任何一个接口上接收互联网数据报。路由…

搜狗翻译体验,2024四大翻译工具解析!

为了满足广大用户的需求&#xff0c;市面上涌现出了众多优秀的翻译工具&#xff0c;福昕在线翻译、福昕翻译客户端、海鲸AI翻译、搜狗翻译等。今天&#xff0c;我们就来对比一下这些翻译工具&#xff0c;看看它们各自的特点和优势。 福昕在线翻译&#xff1a;专业精准&#xf…