- 浏览: 199702 次
- 性别:
- 来自: 哈尔滨
文章分类
- 全部博客 (267)
- java.lang (8)
- 问题汇总 (21)
- 异常记录 (20)
- 功能实现 (19)
- 面试总结 (25)
- 技巧总结 (8)
- 常用代码 (4)
- 编程习惯 (3)
- 编码规则 (3)
- java.util (10)
- java.io (1)
- JavaWeb (9)
- MySQL (16)
- SVN (3)
- MyBatis (11)
- Velocity (7)
- 其他知识 (10)
- 人生哲理 (1)
- 人生故事 (1)
- 自我感悟 (1)
- shiro (3)
- 基础知识 (0)
- 问题总结 (1)
- Spring 标签 (1)
- Spring (3)
- 点滴生活 (1)
- DOS (1)
- CAS (4)
- Linux (9)
- Storm (6)
- Shell (1)
- regex (1)
- Collection (4)
- poi (1)
- 经典语句 (1)
- NIO (5)
- concurrent (14)
- RPC (1)
- zookeeper (3)
- 待整理 (2)
- Hadoop (9)
- RabbitMq (2)
- flume (1)
- hive (7)
- hbase (4)
- kafka (1)
- scala (1)
- GC (0)
- java.util.concurrent.atomic (1)
- java.lang.ref (6)
- JVM (2)
- algorithm (1)
- conception (1)
- java key word (1)
- sun.misc (1)
最新评论
一、根据下标删除元素
1.测试代码
2.实现原理
3.其他情况
删除单个元素,可以使用此方式,但多个元素的情况下不可以
因为删除一个元素后,数组的大小以及原来元素的下标都会改变;需要做相应的处理才可。
二、foreach
1.代码实现
运行抛出异常
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
2.异常分析
从定位的异常信息看遍历的过程中进行了 chcek
modCount 实际对数组进行操作的次数,expectedModCount 预期操作次数
初始化
但在遍历的同时,执行了remove操作,导致了 modCount+1 ,与 expectedModCount 不一致
3.为什么删除元素的方法会调用 Next
java foreach 实现原理
中 foreach 实质就是Iterator 的调用实现
删除元素的实现过程
即可以认为调用了 ArrayList 的 Iterator 方法,返回了 其内部实现的静态类 Itr
在foreach 的过程中,即 Iterator 的 next 操作的过程中 每次获取下一个元素前都会进行一次校验
抛出不允许同时进行修改操作的异常
三、Iterator
将集合转为Iterator 通过 Iterator 来进行集合删除的操作。
1.测试代码
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); for(int index = 0 ; index < list.size() ; index++){ if(Objects.equals("a", list.get(index))){ list.remove(index); } } System.out.println(String.valueOf(list));
2.实现原理
/** * Removes the element at the specified position in this list. * Shifts any subsequent elements to the left (subtracts one from their * indices). * * @param index the index of the element to be removed * @return the element that was removed from the list * @throws IndexOutOfBoundsException {@inheritDoc} */ // 在列表中指定位置删除元素。 // 所有后续元素左移(下标减1)。 public E remove(int index) { rangeCheck(index); // 是否越界,index 是否大于了 数组的长度 modCount++; // 操作次数 E oldValue = elementData(index); int numMoved = size - index - 1; // 将index+1后numMoved个元素拷贝到index的位置上 // 覆盖index位置上的元素,多出的一个位置设置为null,等待GC if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // clear to let GC do its work return oldValue; }
3.其他情况
删除单个元素,可以使用此方式,但多个元素的情况下不可以
因为删除一个元素后,数组的大小以及原来元素的下标都会改变;需要做相应的处理才可。
ArrayList<String> list1 = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); for(int index = 0 ; index < list1.size() ; index++){ // 删除 index = 0 即 a 元素后,数组大小变为3,b的下标变为0,所以再次删除的是c,最后退出循环 list1.remove(index); } System.out.println(String.valueOf(list1));
二、foreach
1.代码实现
for (String s : list) { if (s.equals("a")) list.remove(s); }
运行抛出异常
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
2.异常分析
// 异常抛出的位置 final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); } /** * An optimized version of AbstractList.Itr */ private class Itr implements Iterator<E> { int cursor; // index of next element to return int lastRet = -1; // index of last element returned; -1 if no such int expectedModCount = modCount; public boolean hasNext() { return cursor != size; } @SuppressWarnings("unchecked") public E next() { checkForComodification();// 对应的831行代码 int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i]; } }
从定位的异常信息看遍历的过程中进行了 chcek
final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); }
modCount 实际对数组进行操作的次数,expectedModCount 预期操作次数
初始化
int expectedModCount = modCount;
但在遍历的同时,执行了remove操作,导致了 modCount+1 ,与 expectedModCount 不一致
3.为什么删除元素的方法会调用 Next
java foreach 实现原理
中 foreach 实质就是Iterator 的调用实现
/** * Returns an iterator over the elements in this list in proper sequence. * * <p>The returned iterator is <a href="#fail-fast"><i>fail-fast</i></a>. * * @return an iterator over the elements in this list in proper sequence */ public Iterator<E> iterator() { return new Itr(); } /** * An optimized version of AbstractList.Itr */ private class Itr implements Iterator<E> {}
删除元素的实现过程
public boolean remove(Object o) { if (o == null) { for (int index = 0; index < size; index++) if (elementData[index] == null) { fastRemove(index); return true; } } else { for (int index = 0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); return true; } } return false; }
即可以认为调用了 ArrayList 的 Iterator 方法,返回了 其内部实现的静态类 Itr
在foreach 的过程中,即 Iterator 的 next 操作的过程中 每次获取下一个元素前都会进行一次校验
抛出不允许同时进行修改操作的异常
三、Iterator
Iterator<String> iterator = list.iterator(); while(iterator.hasNext()){ if(StringUtils.isNotEmpty(iterator.next())){ iterator.remove(); } }
将集合转为Iterator 通过 Iterator 来进行集合删除的操作。
发表评论
-
使用软引用构建敏感数据的缓存
2017-11-16 22:19 804使用软引用构建敏感数 ... -
JSP自定义标签
2017-11-14 20:35 308JSP页面中分页功能实现使用了 <urlChange ... -
手机号码替换中间四位
2017-10-24 21:41 891需求描述: 为用户隐私考虑,展示用户信息时需要将中间用*代替 ... -
统计每天的数据
2017-10-10 21:23 497需求:按天统计数据 分析:create_time 为 dat ... -
基于AbstractDataSource实现主从数据库切换
2017-10-07 18:03 980基于AbstractDataSource实现主从数据库切换 ... -
服务器文件下载
2016-03-27 09:53 342项目需求:在列表页面上提供文件下载链接 项目实现: 1.准 ... -
扫码登录功能实现
2015-08-21 08:19 484需求:PC端(电脑端) ... -
基于SHIRO实现用户登陆后跳转其匿名访问的URL路径
2015-07-15 15:03 3579需求描述: 用户在未登录时访问网站中某个需要登录后才能访问 ... -
基于SHIRO的管理后台权限认证系统实现(一)
2015-07-09 10:05 6943基于SHIRO的管理后台权限认证系统实现(一) 一、项目需求 ... -
基于SHIRO的管理后台权限认证系统实现(二)
2015-06-28 10:14 780用户登陆系统后左侧菜单加载 项目:管理员系统 功能:用户登 ... -
Velocity中set的使用
2015-05-26 10:46 494问题:从页面接收某字段的提交数据,数据要求是组合后的编号 ... -
Velocity页面中输出时间年月
2015-05-19 20:52 940问题:注册页面要求有创建时间的选项添加,年为至今为止 实现: ... -
Set判重操作实现
2015-05-15 15:28 759需求:Set<Po>判重操作实现 问题:Set& ... -
如何去除List集合中的重复数据
2015-05-15 13:12 872需求:用户权限查看, ... -
Date相关功能实现
2015-05-12 19:47 586一、同一天 需求:用户记录跟踪列表展示,要求用户数据同一天内 ... -
velocity截取过长的字段值
2015-05-11 20:06 333问题:页面列表展示时,某个字段的值超长,影响页面的整体样式 ... -
将list中某个元素放在首位
2015-05-10 17:25 4499需求:程序开发过程中,业务方要求在展示国家列表时要将US放在首 ... -
Velocity遍历map与遍历list
2015-04-22 20:16 6891问题: 向页面传递key与value的组合 1. 1.1 ...
相关推荐
主要介绍了C#遍历List并删除某个元素的方法,实例分析了正序与倒序遍历list及删除元素的使用技巧,需要的朋友可以参考下
在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致在foreach中删除元素时会抛出异常。 集合已修改;可能无法执行枚举操作。 方法一:采用for循环,并且从尾到头遍历 如果...
上一节课中讲解的内容都比较基础,今天,我们来深挖一下,如果在使用迭代器遍历集合的同时增加、删除集合中的元素,会发生什么情况?不过,并不是所有情况下都会遍历出错,
下面小编就为大家带来一篇java中循环遍历删除List和Set集合中元素的方法(推荐)。小编觉得挺不错的,在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了C#集合遍历时删除和增加元素的方法,结合实例形式分析了C#针对集合元素的遍历、添加与删除等操作实现方法与注意事项,需要的朋友可以参考下
在本篇文章中小编给大家分享了关于HashMap和List遍历方法及如何遍历删除元素知识点总结,需要的朋友们参考下。
在遍历链表的过程中,我们将每个元素与集合中的元素进行比较,如果发现重复,则删除链表中的该元素。 在这段代码中,LinkedList类包含一个removeDuplicates方法,用于去除链表中的重复元素。我们使用一个HashSet来...
其中Collection接口是Java集合框架的基础接口之一,定义了一些基本的集合操作,包括添加元素、删除元素、遍历集合等。在这里,我将为您详细介绍Java集合框架中的Collection接口。 Collection接口是Java集合框架中的...
NULL 博文链接:https://chenlinbo.iteye.com/blog/832335
Collection接口继承自Iterable接口,这意味着可以通过for-each循环遍历集合元素。 List接口是有序的集合,可以包含重复的元素。List接口提供了按照索引位置访问元素的方法,以及添加、删除和修改元素的操作。List...
• 抽象的针对不同Java集合实现的比较实验,以找出时间与集合大小之间的关系,以及在检索过程中,从集合中删除元素以及遍历每个集合中的所有元素的过程。 • 方法用数字填充集合,并测量进行散文的时间,然后将结果...
增加 add(E):尾部添加,...remove(E) :删除指定元素,需要先遍历找到指定元素,因此时间复杂度是 O(N) remove(index):删除指定位置元素,删除后需要将指定位置后面的元素全部向前移动一个位置,时间复杂度 O(N)
本文实例讲述了Python list列表中删除多个重复元素操作。...如果采用for循环遍历各元素: for x in l: if x == 6: l.remove(x) 结果为[9, 5, 7, 8, 9, 6, 0],后面的6没有删除。主要因为remove改变了list长度和每
5) 使用迭代器遍历集合并输出集合的元素,将排序后输出的结果写入out.txt文件中,IO操作需要有异常处理; 例如:定义学生父类和不同阶段学生子类(本科生、研究生等),包含学生信息(学号、姓名、成绩或年龄等),...
数据对象V:V是具有相同特性的数据元素的集合,称为顶点集 数据关系R: R={VR} VR={,w>|v,w∈V且P(v,w),,w>表示从v到w的弧, 谓词P(v,w)定义了弧,w>的意义或信息} 基本操作P: CreatGraph(&G,V,VR) 初始条件:V是...
多线程及list集合的基本使用,可添加元素、遍历元素、删除元素
而LinkedList是一个基于链表实现的List,它在插入和删除元素时效率比ArrayList高,但是随机访问元素则需要遍历链表,效率较低。 List接口常用的方法 1、void add(int index, E element):在指定索引位置插入元素。 2...
另外 我们可以先把hashMap 转为集合Collection,再迭代输出,不过得到的对象 //方法一: 用entrySet() Java代码 Iterator it = emails.entrySet().iterator(); while(it.hasNext()){ Map.Entry m=(Map...