首页 > 编程语言 >JavaSE--集合总览04:集合的并发修改问题,Collections类的操作以及可变参数

JavaSE--集合总览04:集合的并发修改问题,Collections类的操作以及可变参数

时间:2024-09-15 10:52:45浏览次数:13  
标签:... 遍历 迭代 删除 元素 集合 总览 04

一.集合的并发修改问题

关于集合的并发修改问题---就是把集合内包含某个值的元素都删了

以下是一个实例:要求删除含"李"的元素

分析:大家都知道可以遍历集合的方式-----迭代(Iterator),增强型for循环,普通for循环,Lambda简化。前面01有关于遍历的详细介绍喔快速入口:http://t.csdnimg.cn/xRtje

要删除上面含“李”的字大家有很多种方法,但是大多数都会出错以下是大致方法的错误点以及修改方法:

迭代器:

直接这样写会报错

这是因为迭代器在遍历集合时会维护一个修改计数器,当通过迭代器以外的方式(如直接使用集合的 remove 方法)修改集合时,这个计数器就会与迭代器内部记录的不一致,从而导致异常。
所以解决方法就是使用迭代器提供的删除数据的方法:
迭代器对象.remove();删除迭代器当前遍历到的数据:每删除一个数据后 相当也在底层做了i--

修改为:

增强型for循环------注意:增强型也是不能直接做的,原因:增强型本质上也是迭代器解决方法是 将遍历到的满足条件的元素添加到新的集合在删除----比较麻烦

正确方式


普通for循环:

注意:使用for循环删除数组或者集合某个元素,一定要注意删除元素后索引会前移所以一定要删除后i--或者i++(倒着删除)

Lambda表达式:原因和前面一样。当在遍历集合的过程中直接删除集合中的元素时,会导致集合的结构发生变化,而遍历操作正在进行,这就破坏了遍历的预期状态,从而引发 ConcurrentModificationException  异常。

解决方法:

二.Collections类的操作

Collections是集合工具类相当于Arrays数组类的操作

Collections工具类提供的常见都操作集合的方法有:addAll(集合名,元素1,元素2....)--添加元素到集合,shuffle(集合名)---打乱集合内元素的顺序,sort(集合名)---对集合排序默认升序

注意:集合内是对象是则要自己指定比较规则---详细可见03Set集合的介绍最下面快速进入:http://t.csdnimg.cn/x0aTB

实例:

这是对学生类的修改:

运行结果:

三.可变参数

可变参数:是一种特殊的形参,定义在方法构造器的形参列表里,格式是:数据类型...参数名称

关于它的注意事项:

1:一个形参列表中,只能有一个可变参数,因为前面的可变参数会把后面的也拿去
public static void test(int...number,int...number2){}
2:可变参数必须放在形参列表的下最后面
public static void test2(int age,int...number){}
3:可变参数在方法内部,本质就是一个数组
public static void test(int...number){
    System.out.println(number.length);
    System.out.println(Arrays.toString(number));
    System.out.println("---------------------");}

实例:

结果:

标签:...,遍历,迭代,删除,元素,集合,总览,04
From: https://blog.csdn.net/weixin_62189092/article/details/142280232

相关文章

  • 洛谷P1004
    题目传送门:传送门p1004题目背景NOIP2000提高组T4题目描述设有 N×NN×N 的方格图 (N≤9)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 00。如下图所示(见样例):某人从图的左上角的 AA 点出发,可以向下行走,也可以向右走,直到到达右下角的 BB ......
  • 蓝易云服务器 - Ubuntu16.04安装VSCode教程
    安装VSCode的教程如下:打开终端,运行以下命令更新软件包列表:sudoaptupdate安装依赖库:sudoaptinstallsoftware-properties-commonapt-transport-httpswget导入MicrosoftGPG密钥:wget-qhttps://packages.microsoft.com/keys/microsoft.asc-O-|sudoapt-keyadd-添加Visual......
  • Ubuntu 20.04 解决 NVIDIA-SMI 出错问题
    目录一、初始问题二、解决方法2.1法一2.2法二三、新的问题3.1解决方案3.2进一步解决3.3最后解决一、初始问题       今天要在本机上装个环境时,运行了一下nvidia-smi突然遇到一个问题:FailedtoinitializeNVML:Driver/libraryversionmismatch......
  • 读构建可扩展分布式系统:方法与实践04应用服务
    1. 应用服务1.1. 任何系统的核心都在于实现应用需求的特定业务逻辑1.2. 服务是可扩展软件系统的核心1.2.1. 它们将契约定义为一个API,向客户端声明它们的能力1.3. 应用服务器高度依赖于编程语言,但通常都会提供多线程编程模型,允许服务同时处理许多请求1.4. 多服务配置......
  • D04【python接口自动化学习】-python基础
    day04数字类型学习日期:0911学习目标:day04数字类型:存储数字应该用哪种数据类型?学习笔记:数字类型及组成数字类型的常见运算数字类型的强制转换#浮点数转换为整数print(int(123.45))#打印变量的类型x=1234print(type(x))#<class'int'>#字符串转......
  • 04. 流程控制
    一、流程控制  流程控制就是用来控制程序运行中各语句执行顺序的语句。基本的流程结构为:顺序结构,分支结构(或称选择结构),循环结构。顺序结构:程序自上到下执行,中间没有任何判断和跳转;分支结构:根据条件,选择性的执行某段代码,有if……else和switch……case两种分支语句;循环结......
  • 「数学::质数」埃氏筛|欧拉筛(埃拉托斯特尼筛法|线性筛法)/ LeetCode 204(C++)
    目录概述1.埃氏筛思路复杂度Code2.欧拉筛(线性筛)思路复杂度Code总结概述上一节我们介绍了对判断一个数是否为质数的方法:「数学::质数」试除法/LuoguP5736(C++)那如果我们期望输出一个范围内的所有质数,使用试除法的时间复杂度是n√n,怎么办呢?LeetCode204:给定整......
  • MAST20004 Probability
    MAST20004ProbabilitySemester2,2024Assignment3:QuestionsDue4pm,Wednesday18SeptemberImportantinstructions:(1)Thisassignmentcontains4questions,twoofwhichwillberandomlyselectedtobemarked.Eachmarkedquestionisworth10points......
  • java集合用法(不断更新中)
    1、将java集合对象中的某些属性的值做运算,并将结果赋值给另外属性。(例如计算人员工资):publicclassStaff{ privateStringname; privateintwages;//每月工资 privateintmonth;//工作月份 privateintsumWages;//总工资 //构......
  • springboot企业门户资讯网站-计算机毕业设计源码04252
    摘 要在当今数字化时代,企业门户资讯网站已成为企业展示形象、传递信息、吸引客户的重要渠道。随着技术的不断发展,传统的网站开发方式已经无法满足现代企业的需求。因此,基于SpringBoot技术的企业门户资讯网站应运而生,旨在为企业提供一个高效、灵活、可扩展的网站解决方案。......