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

news2024/12/23 15:33:06

目录

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

二、集合引入

(一)集合的理解与好处

三、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;
    }

    @Override
    public 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接口,也可以调用iterator
        List 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);
        }

        // 增强for
        for (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;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

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

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

相关文章

使用cv::FileStorage对yaml文件进行读写

问题描述&#xff1a;记录使用cv::FileStorage对yaml文件进行读写 参考官网&#xff1a;OpenCV: cv::FileStorage Class Reference WRITE&#xff1a;根据文件路径写文件&#xff0c;如果文件不存在会新建&#xff0c;文件存在则变空白 FileStorage fs(filepath, FileStorag…

新增数据集 SDK、“关系抽取”文本标注、优化模型监控和管理|ModelWhale 版本更新

ModelWhale 带来了新一轮的版本更新&#xff0c;期待为大家带来更优质的使用体验。 本次更新中&#xff0c;ModelWhale 主要进行了以下功能迭代&#xff1a; 数据管理&#xff1a;新增 mw_python_sdk 支持通过查看、下载、制作、更新数据集 文本标注&#xff1a;新增“关系抽取…

【DFDT】DFDT: An End-to-End DeepFake Detection Framework Using Vision Transformer

文章目录 DFDT: An End-to-End DeepFake Detection Framework Using Vision Transformerkey points贡献方法补丁提取和嵌入基于注意力的补丁选择多流transformer块多尺度分类器实验DFDT: An End-to-End DeepFake Detection Framework Using Vision Transformer 会议/期刊:App…

Apache Linkis + OceanBase:如何提升数据分析效率

计算中间件 Apache Linkis 构建了一个计算中间件层&#xff0c;以实现上层应用程序和底层数据引擎之间的连接、治理和编排。目前&#xff0c;已经支持通过数据源的功能&#xff0c;实现用户通过Linkis 对接并使用 OceanBase数据库。 本文详细阐述了在 Apache Linkis v1.3.2中&a…

【虚拟化】内核级虚拟化技术KVM介绍,全/半虚拟化的区别,使用libvirt搭建虚拟化平台(go/java/c++)

【虚拟化】内核级虚拟化技术KVM介绍&#xff0c;全/半虚拟化的区别&#xff0c;使用libvirt搭建虚拟化平台&#xff08;go/java/c&#xff09; 文章目录 1、虚拟化技术分类与架构&#xff08;KVM&#xff0c;Xen&#xff09;&#xff0c;全/半虚拟化的区别2、libvirt介绍3、使用…

【北京迅为】《STM32MP157开发板嵌入式开发指南》-第二十四章 安装 Samba

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

举个栗子!Tableau 技巧(283):用山丘图呈现项目周期

人们常常用爬山来比喻工作中做项目的过程&#xff1a;明确目标、规划路线、团队合作、应对挑战&#xff0c;然后享受登顶并在下山后总结经验教训。 图片来自网络 在 Tableau 中做项目分析时&#xff0c;将一段时期的项目用山丘图来呈现&#xff0c;山丘大小代表项目周期的时间…

RAG(Retrieval-Augmented Generation,检索增强生成)

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 RAG&#xff08;Retrieval-Augmented Generation&#xff09;是一种结合信息检索与生成式模型的混合架构&#xff0c;旨在提升自然语言生成任务的准确性、丰富性和知识覆盖范围。它通过在生成过程…

sqli-labs less-20 less-21 less-22 cookie注入

COOKIE 作用&#xff1a;是由网络服务器存储在你电脑硬盘上的一个txt类型的小文件&#xff0c;它和你的网络行为有关&#xff0c;记录了当前用户的状态 形式&#xff1a;keyvalue 例如&#xff1a;当我们登录某个账号后&#xff0c;服务器会在cookies进行记录 个人理解&#xf…

基于Vue3+pinia+vue-router+axios+element-plus等开发的新闻发布管理系统

新闻发布管理系统是一个基于Vue3piniavue-routeraxioselement-plus等开发的系统&#xff0c;主要功能包括&#xff1a;登录模块、注册模块、新闻分类管理模块、新闻管理模块、个人中心模块&#xff08;包括基本资料、更换头像、重置密码功能&#xff09;等。 代码下载&#xf…

指针式表盘指针关键部位分割系统源码&数据集分享

指针式表盘指针关键部位分割系统源码&#xff06;数据集分享 [yolov8-seg-LSKNet&#xff06;yolov8-seg-C2f-EMSC等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Gl…

MAX模型转为las点云模型

在做一个小项目&#xff0c;探测闯入的野生动物。在做案例&#xff0c;需要用到一些野生动物的点云模型。公开的模型像斯坦福等学术机构&#xff0c;以及Thingiverse、Digital Morphology都没有合适的。但是在一些3d数据库中可以下载到max模型&#xff0c;如图1所示。通过3dmax…

英伟达RTX 5090和RTX 5080

英伟达RTX 5090和RTX 5080 一、英伟达RTX 5090和RTX 5080显卡参数的更为详细的介绍&#xff1a; RTX 5090 显卡参数 GPU核心与架构 核心代号&#xff1a;GB202-300-A1。 架构&#xff1a;Blackwell架构&#xff0c;这是英伟达最新的显卡架构&#xff0c;旨在提供更高的性能…

C++内部类和匿名对象

1.内部类 内部类就是定义在一个类的内部的类&#xff0c;比如 #include<iostream> using namespace std; class AA{ public:class BB {public:void print(const AA& A){cout << A.aa1 << " " << A.aa2 << endl;}private:}; priv…

RabbitMQ初识

目录 Kafka RocketMQ RabbitMQ MQ界面(它使用的端口号5672&#xff0c;界面是15672&#xff09; 如何添加一个虚拟机&#xff0c;点击右侧 Topics&#xff08;通配符模式&#xff09; 发布确认机制 持久性(可靠性保证的机制之一) JDK17,Linux服务器Ubuntu 什么是MQ 实…

recyclerView(kotlin)

recyclerView的优点 使用viewHolderRecycledViewPool的方式复用资源&#xff0c;提高性能利用LayoutManager&#xff0c;可根据不同需求使用不同的布局&#xff0c;且可以方便使用对应布局提供的方法&#xff0c;如快速定位item等。RecyclerView 提供了一个 ItemAnimator 接口…

msvcp110丢失怎么解决?三种方法教你修复msvcp110.dll丢失

1. msvcp110.dll 概述 1.1 定义与作用 msvcp110.dll 是 Microsoft Visual C 2012 Redistributable Package 的一部分&#xff0c;它是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;对运行时环境至关重要。这个文件包含了 C 标准库的实现&#xff0c;为基于 Vis…

ssm智能社区管理系统的设计与实现

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 目 录 目 录 III 1 绪论 1 1.1 研究背景 1 1.2 目的和意义 1 1.3 论文结构安排 2 2 相关技术 3 2.1 SSM框架介绍 3 2.2 B…

代码质量管理 SonarScanner 扫描分析实战

在软件开发过程中&#xff0c;代码质量管理是一个至关重要但往往被忽视的环节。糟糕的代码不仅会增加维护成本&#xff0c;还可能导致不可预见的Bug和系统崩溃。如何用更有效的工具来保障代码质量呢&#xff1f;今天&#xff0c;我们将聚焦 SonarScanner&#xff0c;一个高效的…

51单片机的智能水温控制系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器继电器LED和按键等模块构成。适用于智能热水器控制、泳池水温控制系统等相似项目。 可实现功能: 1、LCD1602实时显示水温信息和上下限 2、温度传感器DS18B20采集水体温度 3、当温度低于下限&#xff0…