集合使用 Iterator 删除元素
针对常见的数据集合,比如 ArrayList 列表,对其进行遍历,删除其中符合条件的某个元素,使用 iterator 迭代器进行迭代,代码如下:
public class PracticeController {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
for (int i=0; i<10; i++){
list.add("Demrystv" + i);
}
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String str = iterator.next();
System.out.println(str);
if (str.equals("Demrystv3")){
list.remove(str);
}
}
}
}
代码运行会报如下异常:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at com.jd.data.controller.practice.PracticeController.main(PracticeController.java:16)
Demrystv0
Demrystv1
Demrystv2
Demrystv3
看了一下 iterator 的源码,发现迭代器在调用next方法时,会检查列表是否被修改过,如果被修改过,就会抛出ConcurrentModificationException异常。因为Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。因此 Iterator 在工作的时候是不允许被迭代的对象被改变的,所以不能在使用 iterator 进行遍历的同时 list 移除这个元素。因此,可以使用 iterator 的remove 方法。修改后的代码如下
public class PracticeController {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
for (int i=0; i<5; i++){
list.add("Demrystv" + i);
}
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String str = iterator.next();
System.out.println(str);
if (str.equals("Demrystv3")){
iterator.remove();
}
}
System.out.println("======移除元素后======");
for (int j=0; j<list.size(); j++){
System.out.println(list.get(j));
}
}
}
运行结果如下:
Demrystv0 Demrystv1 Demrystv2 Demrystv3 Demrystv4 ======移除元素====== Demrystv0 Demrystv1 Demrystv2 Demrystv4
集合使用 Iterator 删除元素的更多相关文章
- java list集合遍历时删除元素
转: java list集合遍历时删除元素 大家可能都遇到过,在vector或arraylist的迭代遍历过程中同时进行修改,会抛出异常java.util.ConcurrentModification ...
- 遍历集合的Iterator删除其中的元素
package list; import java.util.LinkedList; /* * 遍历集合的时候删除其中的元素 从后往前删,每次都删除的是最后一个元素,不涉及移位 */public cl ...
- 面试题:测试给定的list,使用for,foreach,iterator删除元素的不同表现
上代码: 1. 使用增强for循环(foreach) package com.xxx; import java.util.ArrayList; import java.util.List; /** * ...
- iterator删除元素
总结 在需要的删除等操作时,不能使用简单的foreach,因为其底层依然用的是Iterator,但是调用的是集合中的remove方法. 使用迭代器对象调用其中的remove方法,以保证线程同步.
- python 集合从头部删除元素
num_set = , , , , ]) num_set.pop() print(num_set) num_set.pop() print(num_set)
- 【Java】集合(List、Set)遍历、判断、删除元素时的小陷阱
开发中,常有场景:遍历集合,依次判断是否符合条件,如符合条件则删除当前元素. 不知不觉中,有些陷阱,不知你有没有犯. 一.漏网之鱼-for循环递增下标方式遍历集合,并删除元素 如果你用for循环递增下 ...
- java中List遍历删除元素-----不能直接 list.remove()
https://blog.csdn.net/github_2011/article/details/54927531 这是List接口中的方法,List集合调用此方法可以得到一个迭代器对象(Itera ...
- 集合遍历过程iterator, 添加删除元素报异常
list set 遍历过程中添加或者删除元素,报异常. 使用iterator 也会报异常 ConcurrentModificationException remove只能用迭代器的remove,而 ...
- Iterator的remove方法可保证从源集合中安全地删除对象(转)
如果对正在被迭代的集合进行结构上的改变(即对该集合使用add.remove或clear方法),那么迭代器就不再合法(并且在其后使用该迭代器将会有ConcurrentModificationExcept ...
随机推荐
- DNS 查询 - Domain Name Server
DNS 查询 - Domain Name Server socket.getaddrinfo("www.baidu.com",None) 返回时一个 tuple list - (f ...
- Eclipse 无法引用到Maven 解决方法
问题描述:打开Eclipse进入java EE视图下,发现原有的Maven Dependencies目录不存在,显示的是org.maven.ide.eclipse.MAVEN2_CLASSPATH_C ...
- xmake v2.3.1 发布, 无缝对接其他构建系统
最近对xmake内部做了不少的重构来改进,并且新增了不少实用的新特性,欢迎来体验. 项目源码 官方文档 一些新特性: 一键编译其他构建系统维护的项目,实现无缝对接,并且支持交叉编译(比如autotoo ...
- SpringMVC版本报错解决办法
报错代码: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...
- codewars--js--Find The Parity Outlier
问题描述:(找出奇数数组中唯一的偶数,或是偶数数组中唯一的奇数) You are given an array (which will have a length of at least 3, but ...
- pikachu-服务器端请求伪造SSRF(Server-Side Request Forgery)
一.SSRF概述(部分内容来自pikachu平台) SSRF(Server-Side Request Forgery:服务器端请求伪造),其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功 ...
- Android埋点方案的简单实现-AOP之AspectJ
个人博客 http://www.milovetingting.cn Android埋点方案的简单实现-AOP之AspectJ AOP的定义 AOP为Aspect Oriented Programmin ...
- Linux 简介、目录结构
Linux是类 Unix 操作系统. 根据原生程度可分为: 内核版本 发行版本:一些公司.组织在内核版的基础上进行二次开发 根据市场需求可分为: 服务器版:没有好看的界面,在终端操作,类似于dos 桌 ...
- spark基本概念整理
app 基于spark的用户程序,包含了一个driver program和集群中多个executor driver和executor存在心跳机制确保存活3 --conf spark.executor. ...
- Java垃圾回收手册翻译 - 什么是垃圾回收
Java垃圾回收手册翻译 - 什么是垃圾回收 初看之下,垃圾回收应该要做其名称之事 - 找到和丢掉垃圾.然而事实上它正好做着相反的事,垃圾回收会记录所有仍在使用中的对象,然后将其他标记为垃圾.谨记这点 ...