1️⃣Java中的集合体系学习汇总(List/Map/Set 详解)

目录

01. Java中的集合体系

02. 单列集合体系​

1. Collection系列集合的遍历方式

(1)迭代器遍历(2)增强for遍历​编辑(3)Lambda表达式遍历

 

03.List集合详解

04.Set集合详解

05.总结

Collection系列集合使用场景:​

集合的并发修改异常问题:①问题原因②解决办法


01. Java中的集合体系

Java中的集合分为两大类:

  • 单列集合(collection):添加数据时,一次只添加一个数据。数据带有下标

  • 双列集合(Map):在添加数据时,一次要添加一对数据;key和value(键值对)

02. 单列集合体系

单列集合起源于Collection接口,分为List集合和Set集合:

①List接口的三个实现类:ArrayList、LinkedList、Vector(现已弃用);

②List系列集合的特点有:有序、可重复、有索引,有序是指存入的顺序和取出时的顺序是相同的;

③Set接口有两个实现类:HashSet、TreeSet;

④Set系列集合的特点有:无序、不可重复、无索引,取数据时的顺序是随机的。

(1)单列集合顶层接口Collection

常用方法:

注意点:

1.添加元素 add 细节1: 如果我们要往List系列集合中添加数据, 那么方法永远返回true, 因为List系列的是允许元素重复的。 细节2: 如果我们要往Set系列集合中添加数据,如果当前要添加元素不存在,方法返回true,表示添加成功。 如果当前要添加的元素已经存在, 方法返回false,表示添加失败。因为Set系列的集合不允许重复。

2.删除 remove 细节1: 因为collection里面定义的是共性的方法, 所以此时不能通过索引 进行删除。 只能通过元素名称进行刷除。 细节2: 方法会有一个布尔类型的返回值, 删除成功返回true, 删除失败返回false,如果要除的元素不存在,就会删除失败。

4.判断元素是否包含 contain 细节:底层是依赖equals方法进行判断是否存在的。 所以,如果集合中存储的是自定义对象,也想通过contains方法来判断是否包含,那么在java Bean类中,一定要重写equals方法

源码查看方法: 方法一:选中contains()方法,Ctrl+B跟进,进入到Collection接口中的源码; 方法二:选中contains()方法,右键,选择Go to --> implements 然后选择对应的实现类

1. Collection系列集合的遍历方式

(1)迭代器遍历

迭代器Iterator简介:

代码示例:

//1.创建集合并添加元素
Collection<String> coll = new ArrayList<>();
​
coll.add("一");
coll.add("二");
coll.add("三");
coll.add("四");
coll.add("五");
coll.add("六");
​
//2.通过集合获取迭代器,迭代器就好比一个箭头,刚获取时默认指向集合首个元素
Iterator it = coll.iterator();
while (it.hasNext()){Object str = it.next();System.out.println(str);
}

迭代器使用注意点:

  • 当指针已经指向集合末尾时(如下图),继续调用next( )方法会报错误:NoSuchElementException

  • 迭代器遍历完毕后,指针不会自动复位;下次再遍历时需要再创建一个迭代器对象。

  • 在每次遍历中,next( )方法通常只调用一次,并用一个变量接收返回的元素;(因为每调用一次next( )方法,指针就会向后移动一位,所以每移动一次就要判断一下是否已经指向末尾了)

  • 迭代器遍历时,不能用集合的方法进行增加或删除。否则会引发并发修改异常:ConcurrentModificationException

那么如何在遍历集合时删除集合中元素呢?方法如下:

        使用Iterator.remove() 最安全和推荐的方法是使用迭代器的remove()方法,该方法专为遍历期间的安全删除设计。

List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {String element = iterator.next();if ("B".equals(element)) {iterator.remove();}
}
System.out.println(list); // 输出: [A, C]

优点:不抛异常,适用于多种集合(List、Set等)。

缺点:代码较为冗长,需要显式使用迭代器。

原文链接:java中如何在集合遍历过程中删除元素(5种方法对比、案例、常见的错误及其后果)_java集合删除元素-CSDN博客

(2)增强for遍历

        (小tips:在IDEA中快速打出增强for结构的写法:集合或数组名.for + Enter

        注意:增强for的底层是用迭代器实现的,在遍历时,也不能直接用集合的方法对元素进行增加或删除。否则会引发并发修改异常ConcurrentModificationException

(3)Lambda表达式遍历

 示例代码 :

 public static void main(String[] args) {Collection<Object> coll = new ArrayList<>();coll.add("张三");coll.add("李四");coll.add(456);coll.add(789);
​
//        for (Object o : coll) {
//            System.out.println(o);
//        }
​//常规写法coll.forEach(new Consumer<Object>() {@Overridepublic void accept(Object o) {System.out.println(o);}});
​//结合Lambda表达式写法coll.forEach((o) -> {System.out.println(o);});//再次简化coll.forEach(o->System.out.println(o));//结合方法引用,且前后参数一样时,再次简化coll.forEach(System.out::println);
​
​}

03.List集合详解

由于篇幅过长,为方便大家浏览,这部分内容单独开了一片博客:

Java基础进阶——List集合详解(看这一篇就够了,详解)-CSDN博客list集合属于Java集合体系中的单列集合,继承于父类Collection,如果你对Collection不了解,可以先看这篇文章1️⃣Java中的集合体系学习汇总(List/Map/Set 详解)-CSDN博客细节1: 如果我们要往List系列集合中添加数据, 那么方法永远返回true, 因为List系列的是允许元素重复的。细节2: 方法会有一个布尔类型的返回值, 删除成功返回true, 删除失败返回false,如果要除的元素不存在,就会删除失败。https://blog.csdn.net/Future_yzx/article/details/145159651?sharetype=blogdetail&sharerId=145159651&sharerefer=PC&sharesource=Future_yzx&spm=1011.2480.3001.8118

04.Set集合详解

Java基础进阶—Set集合详解(HashSet、LinkedHashset、TreeSet看这一篇就够了)-CSDN博客LinkedHashSet是HashSet实现类的子类,该集合中的数据是有序的(指添加数据的顺序和获取数据的顺序一致)TreeSet实现类,该集合具有排序功能,向其中存入的数据默认按升序的顺序排序Set系列集合常用方法基本都是父接口Collection提供的,没有特有方法。https://blog.csdn.net/Future_yzx/article/details/145160311?sharetype=blogdetail&sharerId=145160311&sharerefer=PC&sharesource=Future_yzx&spm=1011.2480.3001.8118

 05.总结

 

Collection系列集合使用场景:

 

集合的并发修改异常问题

  • 当我们使用迭代器遍历集合,并删除集合中某些数据时程序就会报错;
    (错误代码如下:)

    public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张三");list.add("李四");list.add("王老二");list.add("王五");list.add("李逵");list.add("李世华");
    ​Iterator<String> it = list.iterator();while (it.hasNext()){String str = it.next();if (str.contains("李")){list.remove(str);}}
    }

程序报的异常:

Exception in thread "main" java.util.ConcurrentModificationException

如果我们不用迭代器,用普通for循环来进行相同操作也会有问题;
(错误示例代码:)

//用普通for循环来进行演示:
public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张三");list.add("李四");list.add("李老二");list.add("王五");list.add("李逵");list.add("李世华");
​System.out.println("遍历前:"+list);
​for (int i = 0; i < list.size(); i++) {String s = list.get(i);if (s.contains("李")){list.remove(s);}}System.out.println("遍历后"+list);

输出结果:

遍历前:[张三, 李四, 李老二, 王五, 李逵, 李世华]

遍历后:[张三, 李老二, 王五, 李世华]

我们发现,程序并没有像我们预期的那样(将list集合内所有包含字符"李 "的元素删除掉);

①问题原因:

        当第一次遍历到元素"李四"时,程序会成功删除;由于ArrayList底层是数组实现的,删除元素后,后面元素会向前移动,这就导致下一个元素(李老二)会移动到当前索引的位置;然后i++,直接越过了对"李老二"的判断。

因此,在遍历集合时,每删除当前元素,就会跳过下一个元素的判断;

②解决办法:

●普通for循环的解决办法

①每次移除完数据以后,执行一次i--  ,示例代码:

for (int i = 0; i < list.size(); i++) {String s = list.get(i);if (s.contains("李")){list.remove(s);i--;//移除完数据后,执行i--}
}

②遍历时,改为从后往前遍历集合,示例代码:

for (int i = list.size()-1; i >= 0; i--) {//从后往前倒序遍历集合String s = list.get(i);if (s.contains("李")){list.remove(s);}
}

●使用迭代器的解决办法:用迭代器自带的remove方法来删除元素

Iterator<String> it = list.iterator();
while (it.hasNext()){String str = it.next();if (str.contains("李")){//list.remove(str);//会发生修改并发异常it.remove();//底层也相当于执行了一次i-- }
}

       

 最后,我们要注意:使用增强for 或 Lambda表达式的方法遍历时,也都会出现并发修改异常,且没有解决办法。

  • 因为增强for的的底层就是迭代器实现的,增强for就是迭代器的简化写法

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

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

相关文章

事件监听,事件类型

点击按钮实现 盒子关闭 随机点名案例 先给开始按钮添加点击事件 获取显示名字的 div 和 开始按钮的 div给开始按钮添加点击事件&#xff0c;设置定时器&#xff0c;每隔35ms内获取一个数组长度内的随机数&#xff0c;将显示名字的 div内的内容替换为该随机数作为下标的数组的内…

基于PyQt - 6的医疗多模态大模型医疗研究系统中的创新构建与应用(上 .文章部分)

一、引言 1.1 研究背景与意义 在当今数智化时代,医疗行业正经历着深刻的变革,对智能化、高效化的需求日益迫切。传统的医疗模式在面对海量的医疗数据、复杂的诊断流程以及个性化的治疗需求时,逐渐显露出局限性。随着人工智能技术的飞速发展,多模态大模型作为一种前沿技术…

微软震撼发布:Phi-4语言模型登陆Hugging Face

近日&#xff0c;微软公司在Hugging Face平台上正式发布了其最新的语言模型Phi-4&#xff0c;这一发布标志着人工智能技术的又一重要进步。Phi-4模型以其140亿参数的高效配置&#xff0c;在复杂推理任务中表现出色&#xff0c;特别是在数学领域&#xff0c;更是展现出了卓越的能…

深度解析Linux中关于操作系统的知识点

操作系统概述与核心概念 任何计算机系统都包含一个基本的程序集合&#xff0c;成为操作系统OS 操作系统是一款进行软硬件管理的软件 操作系统包括&#xff1a; 内核&#xff08;进程管理&#xff0c;内存管理&#xff0c;驱动管理&#xff09; 其他程序&#xff08;例如数据…

IEC103 转 ModbusTCP 网关

一、产品概述 IEC103 转 ModbusTCP 网关型号 SG-TCP-IEC103 &#xff0c;是三格电子推出的工业级网关&#xff08;以下简 称网关&#xff09;&#xff0c;主要用于 IEC103 数据采集、 DLT645-1997/2007 数据采集&#xff0c; IEC103 支持遥测和遥 信&#xff0c;可接…

如何监控和防范小红书笔记详情API的安全风险?

流量监控与异常检测 请求频率监测&#xff1a; 建立一个系统来记录 API 的请求频率。可以通过在服务器端设置计数器或者使用专业的监控工具来实现。例如&#xff0c;对于每个 API 调用者&#xff08;可以通过 API 密钥或者用户标识来区分&#xff09;&#xff0c;记录它们在单…

程序员独立开发竞品分析:确定网站使用什么建站系统

要确定一个网站使用的建站系统&#xff0c;可以通过以下几种方法尝试分析&#xff1a; 查看页面源代码&#xff1a; 打开网站&#xff0c;右键点击页面并选择“查看页面源代码”。在代码中查找一些常见的建站系统标志&#xff0c;例如&#xff1a; WordPress 的迹象&#xff1a…

迅翼SwiftWing | ROS 固定翼开源仿真平台正式发布!

经过前期内测调试&#xff0c;ROS固定翼开源仿真平台今日正式上线&#xff01;现平台除适配PX4ROS环境外&#xff0c;也已实现APROS环境下的单机飞行控制仿真适配。欢迎大家通过文末链接查看项目地址以及具体使用手册。 1 平台简介 ROS固定翼仿真平台旨在实现固定翼无人机决策…

【计算机网络】深入浅出计算机网络

第一章 计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成一种重要的信息服务基础设施 CNNIC 中国互联网网络信息中心 因特网概述 网络、互联网和因特网 网络&#xff08;Network&#xff09;由若干结点&#xff08;Node&#xff09;和连接这些结点的链路…

QT Quick QML 实例之椭圆投影,旋转

文章目录 一、前言二、演示三、部分代码与分析 QML 其它文章请点击这里: QT QUICK QML 学习笔记 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 一、前言 此 Demo 主要用于无人机吊舱视角的模拟&#xf…

Mysql--架构篇--体系结构(连接层,SQL层,存储引擎层,文件存储层)

MySQL是一种广泛使用的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;其体系结构设计旨在提供高效的数据存储、查询处理和事务管理。MySQL的体系结构可以分为多个层次&#xff0c;每个层次负责不同的功能模块。 MySQL的体系结构主要由以下几个部分组成&#…

【SpringSecurity】SpringSecurity安全框架登录校验流程与登录配置示例

文章目录 SpringSecurity安全框架登录校验流程登录配置示例 SpringSecurity安全框架 Security 是一个能够为基于 Spring 的应用程序提供认证、授权以及保护免受攻击的安全框架。它是 Spring 生态系统的一部分&#xff0c;与 Spring 框架无缝集成。这些框架帮助开发者实现认证&…

dockerfile1.0

docker的数据卷 docker file ------------- 自动自定义镜像 docker的数据卷&#xff1a; 容器与宿主机之间&#xff0c;或者容器和容器之间的数据共享&#xff08;目录&#xff09; 创建容器的时候&#xff0c;通过指定目录&#xff0c;实现容器于宿主机之间&#xff0c;或…

晨辉面试抽签和评分管理系统之九:随机编排考生的分组(以教师资格考试面试为例)

晨辉面试抽签和评分管理系统&#xff08;下载地址:www.chenhuisoft.cn&#xff09;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…

信号与系统初识---信号的分类

文章目录 0.引言1.介绍2.信号的分类3.关于周期大小的求解4.实信号和复信号5.奇信号和偶信号6.能量信号和功率信号 0.引言 学习这个自动控制原理一段时间了&#xff0c;但是只写了一篇博客&#xff0c;其实主要是因为最近在打这个华数杯&#xff0c;其次是因为在补这个数学知识…

解决winodws server iis 下的php mkdir(): Permission denied 问题

这个问题报错原因是权限不够&#xff0c;解决办法如下&#xff1a; 1.在php安装目录下&#xff0c;打开配置文件php.ini 把upload_tmp_dir 前面的分号去掉。 2.给上传的文件夹添加权限 在网站的相应目录&#xff0c;比如目录为tmp&#xff0c;添加IUSR用户&#xff0c;并给所…

如何在本地部署大模型并实现接口访问( Llama3、Qwen、DeepSeek等)

如何在本地部署大模型并实现接口访问&#xff08; Llama3、Qwen、DeepSeek等&#xff09; 如何在本地部署大模型并实现接口访问&#xff08; Llama3、Qwen、DeepSeek等&#xff09;模型地址模型下载模型部署指定显卡运行app.py 运行环境requirements 调用接口代码调用 结语 如何…

数据库增量备份和全量备份

数据库增量备份和全量备份 1.修改配置 首先打开配置文件my.ini 添加以下配置 #log-bin"JSSM-20230617FY-bin" log-bin"mysql-bin"# Server Id. server-id1#指令指定写入二进制日志的事件格式 binlog_formatMIXED添加完之后对MySQL服务进行重启 重启之后…

用 Python 从零开始创建神经网络(十九):真实数据集

真实数据集 引言数据准备数据加载数据预处理数据洗牌批次&#xff08;Batches&#xff09;训练&#xff08;Training&#xff09;到目前为止的全部代码&#xff1a; 引言 在实践中&#xff0c;深度学习通常涉及庞大的数据集&#xff08;通常以TB甚至更多为单位&#xff09;&am…

使用 Debug 类的 Assert 方法查找 C# 中的错误

Debug类提供了几种用于调试代码的方法。其Assert方法采用布尔值&#xff0c;如果值为false则抛出异常。第二个参数给出异常应显示的错误消息。如果在调试器中运行时断言失败&#xff0c;您可以选择打开调试器到抛出异常的 Debug.Assert语句。 通常&#xff0c;您使用Debug.Ass…