JAVA 集合list,Map删除元素的方法总结

Java 中list和map遍历删除 List与Map的遍历过程中删除元素 List<Map<String,Object>> list = new ArrayList<Map<String, Object>>(); Map<String,Object> map1 = new HashMap<String, Object>(); List<String> list1 = new ArrayList<String>(); 阅读详情

一、List遍历过程中删除元素

使用索引下标遍历的方式


public static void main(String[] args) {
  List<Integer> list = new ArrayList<Integer>();
  list.add(1);
  list.add(2);
  list.add(2);
  list.add(3);
  list.add(4);
   
  for (int i = 0; i < list.size(); i++) {
   if(2 == list.get(i)){
    list.remove(i);
   }
   System.out.println(list.get(i));
  }
   
  System.out.println("list=" + list.toString());
   
 }

输出结果:

1
2
3
4
list=[1, 2, 3, 4]

这种方式的问题在于,删除某个元素后,list的大小发生了变化,而你的索引也在变化,所以会导致你在遍历的时候漏掉某些元素。比如当你删除第1个元素后,继续根据索引访问第2个元素时,因为删除的关系后面的元素都往前移动了一位,所以实际访问的是第3个元素。因此,这种方式可以用在删除特定的一个元素时使用,但不适合循环删除多个元素时使用。

使用增强for循环的方式


public static void listIterator2(){
  List<Integer> list = new ArrayList<Integer>();
  list.add(1);
  list.add(2);
  list.add(2);
  list.add(3);
  list.add(4);
   
  for (int value : list) {
   if(2 == value){
    list.remove(value);
   }
   System.out.println(value);
  }
   
  System.out.println("list=" + list.toString());
   
 }

输出结果:

Exception in thread "main" 1
2
java.util.ConcurrentModificationException
 at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
 at java.util.ArrayList$Itr.next(Unknown Source)
 at test.ListIterator.listIterator2(ListIterator.java:39)
 at test.ListIterator.main(ListIterator.java:10)

说明:

jdk中对ConcurrentModificationException的描述:

public class ConcurrentModificationException extends

RuntimeException当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。

例如,某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不确定的。如果检测到这种行为,一些迭代器实现(包括 JRE 提供的所有通用 collection 实现)可能选择抛出此异常。执行该操作的迭代器称为快速失败 迭代器,因为迭代器很快就完全失败,而不会冒着在将来某个时间任意发生不确定行为的风险。

注意:此异常不会始终指出对象已经由不同 线程并发修改。如果单线程发出违反对象协定的方法调用序列,则该对象可能抛出此异常。例如,如果线程使用快速失败迭代器在 collection 上迭代时直接修改该 collection,则迭代器将抛出此异常。

注意:迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败操作会尽最大努力抛出 ConcurrentModificationException。因此,为提高此类操作的正确性而编写一个依赖于此异常的程序是错误的做法,正确做法是:ConcurrentModificationException 应该仅用于检测 bug。

Java中的For each实际上使用的是iterator进行处理的。而iterator是不允许集合在iterator使用期间删除的。所以导致了iterator抛出了ConcurrentModificationException 。

 

正确的方式(使用Iterator)

public static void listIterator3(){
  List<Integer> list = new ArrayList<Integer>();
  list.add(1);
  list.add(2);
  list.add(2);
  list.add(3);
  list.add(4);
   
  Iterator<Integer> it = list.iterator();
  while (it.hasNext()){
   Integer value = it.next();
   if (2 == value) {
    it.remove();
   }
    
   System.out.println(value);
  }
   
  System.out.println("list=" + list.toString());
 }

结果:


1
2
2
3
4
list=[1, 3, 4]

这种方式可以正常的循环及删除。但要注意的是,使用iterator的remove方法,如果用list的remove方法同样会报上面提到的ConcurrentModificationException错误。

 

二、Map遍历过程中删除元素

public static void main(String[] args) {
 HashMap<String, String> map = new HashMap<String, String>();
 map.put("1", "test1");
 map.put("2", "test2");
 map.put("3", "test3");
 map.put("4", "test4");
  
 //完整遍历Map
 for (Entry<String, String> entry : map.entrySet()) {
  System.out.printf("key: %s value:%s\r\n", entry.getKey(), entry.getValue());
 }
  
 //删除元素
 Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); 
 while(it.hasNext()){ 
  Map.Entry<String, String> entry= it.next(); 
  String key= entry.getKey(); 
  int k = Integer.parseInt(key);
  if(k%2==1){ 
   System.out.printf("delete key:%s value:%s\r\n", key, entry.getValue());
   it.remove(); 
  } 
 } 
  
 //完整遍历Map
 for (Entry<String, String> entry : map.entrySet()) {
  System.out.printf("key: %s value:%s\r\n", entry.getKey(), entry.getValue());
 }
}

结果:

key: 1 value:test1
key: 2 value:test2
key: 3 value:test3
key: 4 value:test4
delete key:1 value:test1
delete key:3 value:test3
key: 2 value:test2
key: 4 value:test4

注意

但对于iterator的remove()方法,也有需要我们注意的地方:

每调用一次iterator.next()方法,只能调用一次remove()方法。

调用remove()方法前,必须调用过一次next()方法。

JDK-API中对于remove()方法的描述:

void remove()从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。每次调用 next 只能调用一次此方法。如果进行迭代时用调用此方法之外的其他方式修改了该迭代器所指向的集合,则迭代器的行为是不明确的。

抛出:UnsupportedOperationException - 如果迭代器不支持 remove 操作。IllegalStateException - 如果尚未调用 next 方法,或者在上一次调用 next 方法之后已经调用了remove 方法。

总结

以上就是关于List与Map的遍历过程中删除元素的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

点云处理实操(四) -PCL中的点云三角化 阅读详情

相关推荐

Camera mipi通信协议

MIPI(移动行业处理器接口),是的缩写。MIPI移动行业处理器接口)是MIPI联盟发起的为移动应用处理器制定的开放标准。分别定义了一系列的手机内部接口标准,比如摄像头接口CSI、显示接口DSI,其中是由MIPI联盟下Camera工作组指定的接口标准。CSI-2是MIPI CSI第二版,主要由应用层、协议层、物理层组成,最大支持4通道数据传输、单线传输速度高达1Gb/s。

arvin_xiong的博客 3730

Java集合-List

java.util.List接口继承自Collection接口,是单列集合的一个重要分支,习惯性地会将实现了List接口的对象称为List集合,在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素,另外List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致

刘程云的博客 1万+

【SABRE 3D, SABRE 3DxT,LAM设备】2025年9月10日

前文:SABRE 3D系列机台简介本章节详细阐述了在维护期间锁定电气、机械、热力学及重力组件以及化学管线输入的锁定操作流程,旨在降低人员受伤风险。p42~p55。

weixin_46735260的博客 1612

Java集合之List集合

学Java集合之List集合,这一篇不看我替你遗憾

TestXzing的博客 1万+

Obsidian + AI 自动知识管理:手把手教程

装完后,在命令面板(Ctrl+P)搜 "Generate Summary",AI 会在当前笔记末尾追加一段摘要。你一个月前写的、现在想快速回顾的笔记长篇笔记(三千字以上)开会记录这类信息密集的内容过度自动化。有人装上插件后,所有笔记都让 AI 打标签、写摘要、找关联。最后笔记库看起来整整齐齐,但全都是 AI 的链接,你自己完全没参与。这样做的后果是什么?你写过的笔记跟你没有"真实连接"。你还是记不住。你还是不知道自己的知识库里有什么。AI 推荐,你决策。

weixin_43571227的博客 747

大语言模型在构建UNSPSC 分类数据中的应用

UNSPSC 是联合国标准产品和服务代码。本文研究如何利用大语言模型生成分类系统的分析

姚家湾博客 1856

Java LIst集合全解

集合的优势: (1)数组存储的不足与缺陷: 长度开始必须执行,而且一旦指定,无法修改 保存的必须为同一类型的元素 使用数组进行增加/删除操作比较麻烦 (2)集合的好处: 可以动态保存多个对象,使用方便 提供了一系列方便的操作对象的方法,如add、remove、set、get等 使用集合增加/删除较方便 集合的框架图 (重要) 集合主要是两组:单列集合、双列集合 Collection接口有两个重要的子接口List、Set,他们的实现子类都是单列集合 Map接口的实现子类是双列集合,存放K-

吾之奉先的博客 2万+

Qt c++ llama.cpp 运行 LLaMA-3-8B 中文对话机器人(多模态输入)

助手:

寒寒豆豆软件公司的博客 219

【小家java】Java中集合List、Set、Map删除元素的方法大总结(避免ConcurrentModificationException异常)

1、概述 java中的集合框架是我们日常使用得最多的数据结构,而List作为Collection里最重要的一员,使用就更加的频繁了。因此我们平时使用中少不了对List的增删改查,本文就针对于对List的“删”操作进行一个分析,顺便说几个坑,希望能帮助到大家以后可以避免踩坑 2、栗子 有一个List,如果我们要删除其中的一个元素,怎么办呢? 这里我们先用remove方法 3、使用场景...

架构师:通透,才能写出好代码! 2823

如何在MacBook上安装部署原生openclaw

本文介绍了在MacBook上安装OpenClaw的详细步骤:首先通过curl或国内镜像源安装nvm和Node.js(版本≥22),然后使用nvm安装Node.js 24并验证安装。接着通过脚本快速安装OpenClaw,完成安装后选择Qwen作为AI模型并进行OAuth认证。配置过程中可跳过联网搜索和Agent技能设置,最后选择Web界面作为呈现方式。安装完成后,系统会启动openclaw-gateway进程并打开Web界面,用户可通过简单的"hello"指令开始与AI对话。目前基础功能已

木简熙的博客 809

2026华为OD机考双机位C卷++ 双机位B卷 + 双机位A卷 + 2025C/B/A卷+ 往年真题 - 题库目录分值说明 + 考点说明+在线OJ

2025华为OD机考双机位C卷++ 双机位B卷 + 双机位A卷 + 2025C/B/A卷+ 往年真题 - 题库目录分值说明 + 考点说明+在线OJ

算法大师! 5万+

Java 各集合接口常用方法对照表

Java 各集合接口常用方法对照表

YiHanXii的博客 418

详解Linux下使用vscode编译运行和调试C/C++

本教程将具体详解使用Visual Studio Code在Linux环境下使用C/C++方法。 GCC C++ 编译器 (g++) 和 GDB 调试器的方法。 GCC是GNU 编译器集合; GDB 是 GNU 调试器。 1.先决条件 安装Visual Studio Code. 安装C++拓展插件。点击在vscode界面最左侧的Extensions图标(打开快捷键:ctrl+shift+X),搜索“C/C++”,点击进行安装。 确保已安装gcc. 一般ubuntu系统会预装gcc.在终端窗口中输入如下命令

休的博客 6240

Java List Map 遍历通过条件删除元素

Java List Map 遍历通过条件删除元素

xzh_blog 1328

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java集合删除元素的正确操作

List public static void listIterator3(){ List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(2); list.add(3); list.add(4); Iterator<Integ...

BoomMan 4213

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

删除集合中特定元素的几种情况

从集合中删除元素一直是一个比较容易遗漏的知识点,今天来给大家介绍一下删除集合​​中特定元素的一些情况。 ​(一)List如何实现遍历删除 以ArrayList为例  List&lt;String&gt; a1 = new ArrayList&lt;String&gt;(); a1.add("Tom"); a1.add("To...

cjg2522的博客 4540

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java集合:List、Set和Map需要注意的5个问题

前言 Java集合中的List、Set和Map作为Java集合食物链的顶级,可谓是各有千秋。本文将对于List、Set和Map之间的联系与区别进行介绍,以及这三者衍生出来的问题进行介绍(若无特地说明,jdk版本皆为1.8): List、Set和Map的联系和区别是什么? List、Set和Map的使用场景有哪些? List与Set之间的怎么转换? Set是怎么保证元素不重复? 如何在遍历的同时删...

NYfor2020的博客 1072

Java集合(List、Set、Map)

Java中的集合是用于存储和组织对象的数据结构。Java提供了许多不同的集合类,包括List、Set和Map等,以满足不同的需求。下面将介绍一些常见的Java集合类及其使用方法。

程序猿老白~的博客 1467

Java 集合List、Set、HashMap操作二(Map遍历、List反向、Set删除指定元素,集合只读、TreeMap操作、List转Array、List移动元素)

Map遍历 import java.util.Map; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.Map.Entry; //增强For循环 public class Main { public static void main(String[] args)

墨痕诉清风的博客 866

Java笔记——Java集合框架_java 集合框架

调用 set(int index,Object o)方法改变List 集合指定索引处的元素时,指定的索引必须是List 集合的有效索引,例如长度是4,不饿能指定替换 index 值为4的元素,即该方法不会改变List 集合的长度。从集合中删除集合 c 里不包含的元素(相当于把调用该方法的集合变成该集合和集合c 的交集),如果该操作改变了调用该方法的集合,则该方法返回true。从集合中删除集合 c 里包含的所有元素(相当于用调用该方法的集合减集合 c),如果删除了一个或一个以上的元素,则该方法返回true。

a25847a的博客 1481

Java集合类-List Set Map接口

需要注意的是,在不同的编程语言中,List集合的实现可能会有所不同,具体的方法和用法可能会有所区别。List集合是一种常见的数据结构,它可以存储多个元素,并且这些元素的顺序是有序的。通过双向链表连接插入的元素,可以保留插入顺序,并提供按插入顺序或访问顺序遍历元素的能力。1.添加元素:可以使用add()方法将元素添加到List集合的末尾,也可以使用add(index, element)方法将元素插入到指定的位置。//删除指定的对象元素,如果集合中存在多个相同的元素,则只删除第一个匹配的元素。

T_xyLL的博客 188

Kotlin-集合(list,map)

List、mutableList、Map简单使用 遍历和添加元素

DK_long_teng的博客 2217

集合类:List、Set、Map超详细讲解并附带代码块

List 是有序的集合类型,可以通过索引访问元素,允许重复元素。 Set 是无序的集合类型,不允许重复元素。 Map 是一组键值对的集合,每个键只能对应一个值,键是唯一的。

zznn0306的博客 1626

java map list set_浅谈Java中的Set、List、Map的区别

就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组:数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操作数目不固定的一组数据。所有的JAVA集合都位于 java.util包中!JAVA集合只能存放引用类型的的数据,不能存放基本数据类型。JAVA集合主要分为三种类型:Set(集)List(列表)Map...

weixin_34847426的博客 138

删除map、list集合元素总结

删除map: @Test public void removeElementFromMap() { Map<Integer, String> test = new HashMap<Integer, String>(); test.put(1, "a"); test.put(2, "b"); test...

weixin_34375054的博客 82

java HashSet ,TreeSet, List, Map集合

1.HashSet集合 HashSet具有以下特点 (1)不能保证元素的排列顺序 (2)不可重复 (3)HashSet不是线程安全的 (4)集合元素可以是null Set集合的初始化: import java.util.HashSet; import java.util.Set; 需事先声明 Set s=new HashSet(); 常用方法:举例eg. s.add(1);//添加 s.re...

VioletEvgarden的博客 342
上一篇: 关于InputStream类的available()方法
下一篇: spring配置tomcat jdbc pool数据库连接池
syslbjjly
博客等级 码龄15年 18粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值