List遍历中删除元素
2015-10-21 14:04
232 查看
List遍历主要有索引下标遍历、for循环遍历和Iterator迭代遍历,索引下标和for循环在遍历中删除元素都存在问题,Iterator迭代可以实现遍历中删除元素。
遍历方式中删除元素并不会抛出异常,只是存在漏删元素的情况。
集合在删除值为3的元素时,能正确的删除两个元素。当删除值为2的元素时,只删除第一个元素。原因是删除了第一个2后,集合里的元素个数减1,后面的元素往前移了1位,导致了第二个2被遗漏了。
该代码运行会抛出异常ConcurrentModificationException
ConcurrentModificationException官方描述如下:
当并发修改对象,而这时对该对象的修改是不允许的,就会抛出该异常。例如,当一个线程在遍历集合的时候,其他线程不允许修改该集合。通常情况下,在遍历时修改集合,迭代结果通常是不确定的。有些迭代器检测到这种行为,就会抛出ConcurrentModificationException异常。
Iterator能正确的删除集合中的元素,在遍历中删除元素推荐用这种方法。
索引下标遍历
List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(2); list.add(3); list.add(5); list.add(6); list.add(3); list.add(4); for(int i = 0; i < list.size(); i++){ if(list.get(i).intValue() == 3){ list.remove(i); } } System.out.println(list); //结果 [1, 2, 2, 5, 6, 4]
List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(2); list.add(3); list.add(5); list.add(6); list.add(3); list.add(4); for(int i = 0; i < list.size(); i++){ if(list.get(i).intValue() == 2){ list.remove(i); } } System.out.println(list); //结果 [1, 2, 3, 5, 6, 4, 3]
遍历方式中删除元素并不会抛出异常,只是存在漏删元素的情况。
集合在删除值为3的元素时,能正确的删除两个元素。当删除值为2的元素时,只删除第一个元素。原因是删除了第一个2后,集合里的元素个数减1,后面的元素往前移了1位,导致了第二个2被遗漏了。
for循环遍历
List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(2); list.add(3); list.add(5); list.add(6); list.add(3); list.add(4); for(Integer item : list){ if(item.intValue() == 3){ list.remove(item); } } System.out.println(list);
该代码运行会抛出异常ConcurrentModificationException
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)个 at com.yihaodian.mobile.flume.client.ListDeleteTest.main(ListDeleteTest.java:19)
ConcurrentModificationException官方描述如下:
当并发修改对象,而这时对该对象的修改是不允许的,就会抛出该异常。例如,当一个线程在遍历集合的时候,其他线程不允许修改该集合。通常情况下,在遍历时修改集合,迭代结果通常是不确定的。有些迭代器检测到这种行为,就会抛出ConcurrentModificationException异常。
Iterator遍历
List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(2); list.add(3); list.add(5); list.add(6); list.add(3); list.add(4); Iterator<Integer> iterator = list.iterator(); while(iterator.hasNext()){ Integer item = iterator.next(); if(item.intValue() == 2){ iterator.remove(); } } System.out.println(list); //结果 [1, 3, 5, 6, 4, 3]
Iterator能正确的删除集合中的元素,在遍历中删除元素推荐用这种方法。
相关文章推荐
- Hive中的.hiverc文件及命令运行方式
- 判断浏览器是否安装了flash插件或者禁用的flash插件
- 《细说PHP—第三版》新书出台啦
- 百度地图用法封装
- DATA GRARD安装配置、维护、切换
- Android_07_开机自启动
- Changing the IP Address of a Domain Controller
- Linux下ps命令实现
- PHP多维数组转一维数组,多维护数组转字符串
- 旧文备份:对象字典0x1005和0x1006的理解
- 数组指针/指针数组
- Service和IntentService的区别
- Site Template
- C++11之std::bind
- spring的依赖注入理解
- CCIE SP-RIPv1 小结
- 【NOI2010】【BZOJ2006】超级钢琴
- hdu2368 Alfredo's Pizza Restaurant
- TIPTOP-系統資料重整作業(p_mis)
- Java加密技术(十)——双向认证