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.rhkb.cn/news/443141.html

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

相关文章

[含文档+PPT+源码等]精品基于Nodejs实现的家教服务小程序的设计与实现

基于Node.js实现的家教服务小程序的设计与实现背景&#xff0c;主要源于以下几个方面&#xff1a; 一、家教市场的现状与需求 随着教育竞争的日益激烈&#xff0c;家庭对子女教育质量的重视程度不断提升&#xff0c;家教服务已成为许多家庭不可或缺的一部分。然而&#xff0c…

graphql--快速了解graphql特点

graphql--快速了解graphql特点 1.它的作用2.demo示例2.1依赖引入2.2定义schema2.3定义GrapQL端点2.4运行测试2.5一些坑 今天浏览博客时看到graphQL,之前在招聘网站上第一次接触,以为是图数据查询语言, 简单了解后,发现对graphQL的介绍主要是用作API的查询语言,不仅限于图数据查…

Meta 发布 Quest 3S 头显及 AR 眼镜原型:开启未来交互新视界

简介 在科技的浪潮中&#xff0c;Meta 始终站在创新的前沿&#xff0c;不断为我们带来令人惊叹的虚拟现实和增强现实体验。2024 年 10 月 6 日&#xff0c;让我们一同聚焦 Meta 最新发布的 Quest 3S 头显及 AR 眼镜原型&#xff08;Orion&#xff09;&#xff0c;探索这两款产品…

自由学习记录(2)

Unity打包图集相关 Draw Call 实验设置&#xff1a; 我们将创建两个场景&#xff0c;一个场景有高 Draw Call&#xff0c;另一个场景通过优化减少 Draw Call。然后对比它们的帧率&#xff08;FPS&#xff09;。 场景 1&#xff1a;高 Draw Call 场景&#xff08;无优化&…

【数据结构与算法-高阶】并查集

【数据结构与算法-高阶】并查集 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;数据结构与算法&#x1f345; &#x1f33c;文章目录&#x1f33c; 1. 并查集原理 2. 并查集实现 3. 并查集应用 1. 并查集原理 在一些应用问题中&…

了解HTTPS

目录 1.HTTP认识 2.HTTP请求 3.HTTP响应 4.URL 5.HTTP方法 面试题&#xff1a;POST 和 GET区别&#xff1f; 网上关于 GET 与 POST的差别 有待商议 关于请求报头 和 响应报头 6..Host &#xff1a; 7..USer-Agent&#xff08;简称UA&#xff09; 8.状态码 9.HTTPS 是…

读懂MySQL事务隔离

什么是事务 事务就是一组原子性的SQL查询&#xff0c;或者说一个独立的工作单元。事务内的语句&#xff0c;要么全部执行成功&#xff0c;要么全部执行失败。 关于事务银行系统的应用是解释事务必要性的一个经典例子。 假设一个银行的数据库有两张表&#xff1a;支票表&#x…

【Windows】开始菜单关键错误以及系统应用闪退问题记录

一 开始菜单关键错误 Windows长时间没有重启&#xff0c;重启之后开始菜单点不进去&#xff0c;报错“关键错误”。 查询网上有两种解决方案&#xff1a; 【1】更新系统版本&#xff1b; 【2】通过powershell执行一次性恢复所有应用的指令&#xff1b; 我这边采用第二种方法&am…

如何使用pymysql和psycopg2执行SQL语句

在Python中&#xff0c;pymysql和psycopg2是两个非常流行的库&#xff0c;用于与MySQL和PostgreSQL数据库进行交互。本文将详细介绍如何使用这两个库来执行SQL查询、插入、更新和删除操作。 1. 准备工作 首先&#xff0c;确保已经安装了pymysql和psycopg2库。如果尚未安装&a…

指针函数C++

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

CentOS7.9 下安装 Docker

第一步&#xff1a; sudo yum install -y yum-utils \ > device-mapper-persistent-data \ > lvm2 第二步&#xff1a;安装 sudo wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo yum -y install…

IT监控可视化:运维团队的智慧之眼

在当今这个数字化时代&#xff0c;IT系统已成为企业运营的核心支柱。随着业务的不断扩展和IT架构的日益复杂&#xff0c;运维团队面临着前所未有的挑战。如何高效、准确地监控和管理IT资源&#xff0c;确保系统的稳定性和可用性&#xff0c;成为了运维工作的重中之重。而IT监控…

CSS3--美若天仙!?

免责声明&#xff1a;本文仅做分享~ 目录 CSS引入方式 选择器 盒子尺寸和背景色 文字控制属性 单行文字 垂直居中 字体族 font复合属性 文本对齐方式 文本修饰线 color 文字颜色 ----- 复合选择器 伪类选择器 超链接伪类 CSS特性 继承性 层叠性 优先级 Emmet …

Linux驱动---光电开关、火焰传感器、人体红外传感器

文章目录 一、电路连接二、设备树三、驱动代码 一、电路连接 人体红外 – PF12 检测到人体时会产生一个上升沿 光电开关 – PE15 有遮挡物时会产生一个上升沿 火焰传感器 – PF5 有火焰时会产生一个上升沿 二、设备树 /{ //人体红外PF12human{ compatible "zyx,huma…

数据驱动投资:AI在股票市场的应用

当ChatGPT首次亮相时&#xff0c;其卓越的语言处理能力立刻引起了许多行业的广泛关注&#xff0c;投资界也不例外。关于ChatGPT是否能应用于投资决策的问题&#xff0c;迅速成为热门讨论的焦点。 近期&#xff0c;加拿大多伦多大学和印度孟买理工学院的研究人员联合开展了一项…

[论文阅读] DVQA: Understanding Data Visualizations via Question Answering

原文链接&#xff1a;http://arxiv.org/abs/1801.08163 启发&#xff1a;没太读懂这篇论文&#xff0c;暂时能理解的就是本文提出了一个专门针对条形图问答的数据集DVQA以及一个端到端模型SANDY&#xff0c;模型有两个版本&#xff0c;Oracle和OCR。主要解决的问题是固定词表无…

C++ —— 优先级队列(priority queue)的模拟实现

目录 杂谈 vector和list的区别 1. 优先级队列的定义 2. 优先级队列的模拟实现 3. 仿函数 链接&#xff1a; priority_queue - C Reference (cplusplus.com)https://legacy.cplusplus.com/reference/queue/priority_queue/?kwpriority_queue 杂谈 vector和list的区别 在…

UPDATE 和 DELETE数据库表的多行

文章目录 说明程序测试结果 说明 程序 *&---------------------------------------------------------------------* *& Report Z_TEST_1008 *&---------------------------------------------------------------------* *& *&--------------------------…

手机怎样改网络ip地址?内容详尽实用

随着网络技术的发展&#xff0c;更改手机IP地址已成为一种常见需求。本文将详细介绍如何在不同网络环境下更改手机IP地址&#xff0c;包括移动网络和WiFi网络&#xff0c;以及同时适用于两种网络的方法&#xff0c;内容详尽实用&#xff0c;干货满满。 一、适用于移动网络&…

vue3 vue2

vue3.0是如何变快的&#xff1f; diff算法优化 vue2的虚拟dom是进行全局的对比。vue3 新增了静态标记&#xff08;patchFlag&#xff09; 在与上次虚拟节点进行比较的时候&#xff0c;只对比带有patch Flag的节点&#xff0c;并且可以通过flag的信息得知当前节点要对比的具体内…