大家已知的遍历collection的方式通常有两种,一种是for(object key :collection<object>),一种是应用iterator。这两种方式都能对于collection进行遍历,但是当要移除collection中的部分元素的时候,使用for对于collection进行遍历,想要移除元素,就要调用collection的remove操作,这样可能会给collection的遍历带来bug,而且这个错误及其不容易被发现,下面我们就简要介绍一下造成这种错误的原因:

例如一个ArrayList<String>,其包含的元素由["6.045","6.005","6.813"],然后我们写一个方法要求去除这个list中所有6.开头的String。首先我们尝试用collection.remove进行移除。程序如下:

按我们的初衷,这个函数执行完之后collection应该为空,但是实际并非这种情况,这个函数执行完之后,collection还有6.005存在。这是什么原因呢?下面我们用snapshot进行一定的介绍:

开始的时候snapshot应该属于这种情况

方法臊面list的第一个元素,然后调用其collection.remove方法之后,由于list会进行动态调整数据的状态变成了

然而此时,遍历collection操作认为第0号元素的遍历已经完成,接着他就开始进行对于第1号元素的遍历,这就造成了6.005没有被遍历到,因此也就不会被程序移除。这是一个很难被发现的bug,同时bug出现的几率也不是很大,和数据的组成有关,如果移除的数据后面的数据恰好是不需要的数据,那么这种方式就不会显示出任何错误,如果是需要的数据,这种方式就会造成这个需要的数据不能够被访问。

其实,我们在使用iterator的过程中,iterator接口已经为我们提供了remove操作,应用iterator提供的remove操作移除collection中的元素就不会造成这种错误:

这种方式对collection中的元素进行移除就不会产生任何问题,这是因为iterator的开发者早就已经认识到了这个问题,他在书写iterator.remove 的过程中对于这个问题进行了解决。因此使用iterator.remove移除collection中的元素不会造成任何错误。

转载于:https://www.cnblogs.com/mrchi/p/9216530.html

移除collection中元素的注意事项(应用collection.remove移除元素造成的错误)相关推荐

  1. JS 移除数组中指定索引项

    JS移除数组中的指定的索引的项: ////移除指定索引的对象Array.prototype.remove = function (dx) {if (isNaN(dx) || dx > this. ...

  2. Java 移除List中的元素,这玩意讲究!

    前言 前阵子,一名java初学者 遇到了list 使用remove的问题,当时我暂且给他说了一种解决方案. 事后,我细想, 是不是很多初学者都会碰到这种问题? 虽然阿里开发手册里面有说到这个坑,但是是 ...

  3. PHP 实现移除数组中项目为空的元素或为某值的元素

    在实现移除数组中项目为空的元素或为某值的元素时用到了两个函数 array_filter.create_function 先看一个实例: $array = Array ( [0] => 1 ,[1 ...

  4. JSK-11 移除数组中的重复元素【入门】

    移除数组中的重复元素 给定一个升序排列的数组,去掉重复的数,并输出新的数组的长度. 例如:数组 A={1,1,2},你的程序应该输出 2 即新数组的长度,新数组为 {1,2}. 要求:不能新开数组分配 ...

  5. 【JS实战】移除数组中的元素(返回新的数组)

    移除数组中的元素(返回新的数组) 方法一:for循环+push function remove(arr, item) {let newArr = [];for(let i = 0; i < ar ...

  6. js移除数组中的元素(返回新数组)

    移除数组中的元素(返回新数组) 移除数组 arr 中的所有值与 item 相等的元素.不要直接修改数组 arr,结果返回新的数组. 输入:[1,2,3,4,2] ,2 输出:[1,3,4] 第一种解决 ...

  7. php数组删除值为空的元素,PHP实现移除数组中为空或为某值元素的方法

    本文实例讲述了PHP实现移除数组中为空或为某值元素的方法.分享给大家供大家参考,具体如下: 在实现移除数组中项目为空的元素或为某值的元素时用到了两个函数 array_filter.create_fun ...

  8. JavaScript - 移除数组中的空字符串元素

    移除数组中的空字符串元素 使用 filter 方法对数组进行拷贝,删除空字符串元素,保留其他元素(第 22 ~ 24 行): <!DOCTYPE html> <html>< ...

  9. 移除List中的元素,你的姿势对了吗?

    之前遇到对List进行遍历删除的时候,出现来一个ConcurrentModificationException 异常,可能好多人都知道list遍历不能直接进行删除操作,但是你可能只是跟我一样知道结果, ...

  10. Collection中list集合的应用常见的方法

    集合 : 用存放对象的容器(集合)      Collection : 跟接口 : 单列集合           ---> List :有序的 ,元素是可以重复的.           ---& ...

最新文章

  1. GATB=The Genome Analysis Toolbox with de-Bruijn graph 带有de-Bruijn图的基因组分析工具箱
  2. 学习笔记——深拷贝与浅拷贝
  3. CSS自学教程--一天搞定CSS(终篇总结)
  4. 域名服务器的配置文档,配置自己的域名服务器
  5. 160804、oracle查询:取出每组中的第一条记录
  6. 从 Hello World 开始
  7. java中br.readline_Java:java中BufferedReader的read()及readLine()方法的使用心得
  8. sap sdi mysql_SAP HANA 实时数据模型与导入数据模型之间基于 SDI 的混合
  9. DevEco Studio的下载
  10. 企业为什么要上智能仓储系统?
  11. Android开发笔记(一百三十四)协调布局CoordinatorLayout
  12. 【转】Java 杂谈(三)
  13. p2093 [国家集训队]JZPFAR
  14. mysql5.7 64位linux 安装,Linux安装64位Mysql5.7
  15. 灰色系统理论及其应用 (一) :灰色系统概论、关联分析、与传统统计方法的比较
  16. 【Ubuntu】MTK刷机工具MT8167版本打不开,缺少libpng12-0的解决方法
  17. 计算机检测不到ipod,[已解决]如何修复iTunes无法识别iPod
  18. 【SIPp】Linux-SIPp3.6.0 测试FreeSwitch
  19. 记一次golang cpu 占用100%
  20. 打开我的计算机我的文档不见,win10系统我的文档不见了的设置教程

热门文章

  1. Python-字典遍历
  2. ambari 搭建hadoop大数据平台系列4-配置ambari-server
  3. 20170317起mvc功能学习
  4. 一代女皇武则天——计算机达人成长之路(12)连载
  5. Play项目的application.conf的配置
  6. WinDbg使用摘要
  7. CCIE试验备考之交换security
  8. 2004-6-22+ 用vs.net做的留言板
  9. 鼠标点击切换的两种思路
  10. go -生成pb文件 - 上