游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

List中remove()方法的陷阱,被坑惨了

  来源:blog。csdn。netpelifymeng2articledetails78085836
  Java的List在删除元素时,一般会用list。remove(o)remove(i)方法。在使用时,容易触碰陷阱,得到意想不到的结果。总结以往经验,记录下来与大家分享。
  首先初始化List,代码如下:packagecom。cicc。am。test;importjava。util。ArrayList;importjava。util。List;publicclassListTest{publicstaticvoidmain(String〔〕args){ListIntegerlistnewArrayListInteger();list。add(1);list。add(2);list。add(3);list。add(3);list。add(4);System。out。println(list);}}
  输出结果为〔1,2,3,3,4〕
  1、普通for循环遍历List删除指定元素错误!!!for(inti0;ilist。size();i){if(list。get(i)3)list。remove(i);}System。out。println(list);
  输出结果:〔1,2,3,4〕
  为什么元素3只删除了一个?本以为这代码再简单不过,可还是掉入了陷阱里,上面的代码这样写的话,元素3是过滤不完的。只要list中有相邻2个相同的元素,就过滤不完。
  List调用remove(index)方法后,会移除index位置上的元素,index之后的元素就全部依次左移,即索引依次1要保证能操作所有的数据,需要把index1,否则原来索引为index1的元素就无法遍历到(因为原来索引为index1的数据,在执行移除操作后,索引变成index了,如果没有index1的操作,就不会遍历到该元素,而是遍历该元素的下一个元素)。
  如果这样,删除元素后同步调整索引或者倒序遍历删除元素,是否可行呢?
  2、for循环遍历List删除元素时,让索引同步调整正确!for(inti0;ilist。size();i){if(list。get(i)3)list。remove(i);}System。out。println(list);
  输出结果:〔1,2,4〕
  3、倒序遍历List删除元素正确!for(intilist。size()1;i0;i){if(list。get(i)3){list。remove(i);}}System。out。println(list);
  输出结果:〔1,2,4〕
  4、foreach遍历List删除元素错误!!!for(Integeri:list){if(i3)list。remove(i);}System。out。println(list);
  抛出异常:java。util。ConcurrentModificationException
  foreach写法实际上是对的Iterable、hasNext、next方法的简写。因此从List。iterator()源码着手分析,跟踪iterator()方法,该方法返回了Itr迭代器对象。publicIteratorEiterator(){returnnewItr();}
  Itr类定义如下:privateclassItrimplementsIteratorE{intcursor;indexofnextelementtoreturnintlastRet1;indexoflastelementreturned;1ifnosuchintexpectedModCountmodCount;publicbooleanhasNext(){returncursor!size;}SuppressWarnings(unchecked)publicEnext(){checkForComodification();inticursor;if(isize)thrownewNoSuchElementException();Object〔〕elementDataArrayList。this。elementData;if(ielementData。length)thrownewConcurrentModificationException();cursori1;return(E)elementData〔lastReti〕;}publicvoidremove(){if(lastRet0)thrownewIllegalStateException();checkForComodification();try{ArrayList。this。remove(lastRet);cursorlastRet;lastRet1;expectedModCountmodCount;}catch(IndexOutOfBoundsExceptionex){thrownewConcurrentModificationException();}}finalvoidcheckForComodification(){if(modCount!expectedModCount)thrownewConcurrentModificationException();}}
  通过代码我们发现Itr是ArrayList中定义的一个私有内部类,在next、remove方法中都会调用checkForComodification方法,该方法的作用是判断modCount!expectedModCount是否相等,如果不相等则抛出ConcurrentModificationException异常。
  每次正常执行remove方法后,都会对执行expectedModCountmodCount赋值,保证两个值相等,那么问题基本上已经清晰了,在foreach循环中执行list。remove(item);,对list对象的modCount值进行了修改,而list对象的迭代器的expectedModCount值未进行修改,因此抛出了ConcurrentModificationException异常。
  5、迭代删除List元素正确!
  java中所有的集合对象类型都实现了Iterator接口,遍历时都可以进行迭代:IteratorIntegeritlist。iterator();while(it。hasNext()){if(it。next()3){it。remove();}}System。out。println(list);
  输出结果:〔1,2,4〕
  Iterator。remove()方法会在删除当前迭代对象的同时,会保留原来元素的索引。所以用迭代删除元素是最保险的方法,建议大家使用List过程
  中需要删除元素时,使用这种方式。学习资料:Java进阶视频资源
  6、迭代遍历,用list。remove(i)方法删除元素错误!!!IteratorIntegeritlist。iterator();while(it。hasNext()){Integervalueit。next();if(value3){list。remove(value);}}System。out。println(list);
  抛出异常:java。util。ConcurrentModificationException,原理同上述方法4。
  7、List删除元素时,注意Integer类型和int类型的区别。
  上述Integer的list,直接删除元素2,代码如下:list。remove(2);System。out。println(list);
  输出结果:〔1,2,3,4〕
  可以看出,List删除元素时传入数字时,默认按索引删除。如果需要删除Integer对象,调用remove(object)方法,需要传入Integer类型,代码如下:list。remove(newInteger(2));System。out。println(list);
  输出结果:〔1,3,3,4〕
  总结:
  1、用for循环遍历List删除元素时,需要注意索引会左移的问题。
  2、List删除元素时,为避免陷阱,建议使用迭代器iterator的remove方式。
  3、List删除元素时,默认按索引删除,而不是对象删除。

李响发起国风舞挑战一起来真快乐APP参赛瓜分千万奖金吧他来了!他来了!最近,你有被青年舞蹈家李响圈粉吗?舞台上跳着国风舞的他,姿态曼妙,举手投足间尽显风雅气质,让人忍不住啧啧称赞!近日,李响在真快乐APP赛事专区,发起了一眼……换种思路处理电力大数据,产生了这样的效果?图片来源:视觉中国电力行业的时代新课题河南省电力科学研究院承担的研究课题电网地理信息大数据应用研究项目,经过电科院、河南恩湃电力技术公司与协作单位郑州昂莱云电软件公……狠抓!如何利用视频监控技术遏制考试舞弊行为?近年来,考试作弊的现象并没有停止,考生作弊造成的不公平竞争对考生的考试造成了极大的危害,也对社会产生了不良影响。鉴于考试舞弊的严重危害,有必要采取可靠的方法对舞弊过程进行记录,……翻阅了海外100技术预测,我发现了边缘计算的一些利与弊边缘计算是一种在网络边缘的本地服务器和设备上进行计算的过程,而不是在远程云数据中心进行计算,它正迅速成为一种领先的解决方案,为本地网络技术(尤其是物联网设备)的巨大容量和复杂性……中国首个自主研发的软硬件解耦车用操作系统基于我们新的电子电气架构和BYD的OS,车用功能的迭代周期缩短70以上,迭代速度从过去的两个月缩短到两周。更令人期待的是,即插即用的硬件设计,必将为架构的升级,提供了无限的可能……过来人的真实体验娶带个孩子的离婚女人,有一个很重要的前提娶一个离婚带孩子的女人是什么体验?之前听过一个读者的总结,他说没办法用幸福来形容,但也谈不上过得不幸福。首先自己是做不到视如己出的,没有谁是真心愿意替别人养孩子的,他也不……全年24小时在线,他们每天聆听死亡,帮人们完成最好的告别文易琬玉编辑范婷婷云山收到这个包裹的时候,天正下着小雨。她摸着不甚干燥的盒子,打开的瞬间,映入眼的是熟悉的军绿色,是支边的父亲常穿的那种绿,八一扣有些旧,应该……一种功能强大的新型激光器将增强自适应光学在某些应用中,更大的激光器就意味着更好的激光器。天文学就是这种情况,激光用于从望远镜校准到卫星通信的所有领域。欧洲南方天文台(ESO)及其一些商业合作伙伴开发了一种比现有行业标……iOS14。5B3正式发布,新增2大功能,优化绿屏,建议升级今日凌晨,苹果正式发布了iOS14。5Beta3版本,这也是目前整个iOS14版本中最新的版本。此次iOS14。5B3的版本号为18E5164h,更新安装包大小在496M左右,……青年钢琴家王心源采访首德艺术家巴拉兹佐科莱依教授(访问稿件来源:钢琴艺术杂志)访者按(王心源,青年钢琴家,2018年英国利兹钢琴比赛第三名):在我的音乐道路上,有许多人帮助过我、影响过我。而我的每一位老师,更是在我的成……今年首季全球黄金需求下降23,中国ETF持仓创新高世界黄金协会(WGC)发布《黄金需求趋势报告》,2021年首季全球黄金总需求量为815。7吨,与上季基本持平,但按年下降23,主要由于全球黄金ETF净流出177。9吨。由……出身缇丽莎尔的神首生物黄寿仙两次被罚还继续虚假宣传近日,社交电商预警发布了题为《神首集团,公主家,是宝妈头上的镰刀?》的文章引发广大网友的关注,随后又众多相关参与者向笔者递交了其受害经历,希望予以曝光。图片资料来源于企查……
推荐一些关于战争的电影综合战争电影推荐100部每次想到战争题材的电影都会感慨残酷,本文良心推荐推荐一些关于战争的电影,精选这些好看电影。还有战争电影100部,都是非常不错的,想热血沸腾,这些战争电影就不要错过了。推荐一些关……5nm芯片有希望了国产企业下定决心,投入2000名科研人员如果引擎是机器的心脏,那么对于电子产品而言,芯片必定是其生命线。过去,我国的中兴手机是大型外国公司掌握技术的命脉,甚至手机的生产也受到其他国家的限制。因此,手机芯片的发展决定了……有什么好看的恐怖片2018惊悚题材恐怖电影有什么好看的恐怖片:2018惊悚题材恐怖电影2018国内国外又上映了不少惊悚题材电影,包括豆瓣评分大火的昆池岩,下面带来2018恐怖片豆瓣评分前10名推荐。1。《昆……攀附中国黄金,一珠宝行被判商标侵权不知何时,我们能发现街上不同品牌的黄金珠宝店越来越多,他们的名字和店面装修也越来越像,甚至不仔细分辨很容易认错。近日,就有两家珠宝企业因为相近的商标对簿公堂。近日,长沙市……听说罗永浩晚上要用这个小米有品8万用户爆抢的理发器给自己理发没想到还没迎来报复性消费,到是迎来了报复性涨价!!!不提喜茶、海底捞了,就连我家附近不知名理发店都涨价了!就给理了个寸头,洗剪吹花了50块!!!看着自己的钱包还是心痛……雪鹰领主什么时候开机,雪鹰领主是什么小说改编的雪鹰领主说出来很多人不清楚,可雪鹰领主电视剧是什么时候开机拍摄,很多网友就想去了解一下有关的故事,看雪鹰领主的剧组提前安排要拍摄的内容和演员,过后能顺利开机来上演,但有的网友就……魅族16s和OPPOR17Pro拍照细节对比,结果可能让你难前言618的时候,下单了2399元的魅族16s和1999元的OPPOR17Pro。618大幅跳水的手机很多,之所以选择这两款,无外乎是觉得它们性价比高。今年旗舰机魅族16……斗罗大陆独孤博是好是坏,结局是什么?在斗罗大陆中独孤博封号毒斗罗,是大陆最强人物之一。像一般用毒的人大都被认为是坏人,那么,斗罗大陆独孤博是好是坏呢?在斗罗大陆的剧情中,独孤博的招数以群攻见长,他一出场就击败了史……童年回忆杀手身边的一位朋友记忆力特别的好,他几乎记得之前发生的所有事,而我大概只能回忆起其中为数不多的几件。童年很多很多的事,都是在和他的闲谈中再次记起。每每回想起来都特别感动。一个……祝卿好定北侯和皇上到底是什么关系,祝卿好定北侯可能是谁演的言情剧《祝卿好》给带来的定北侯跟刘家族有着一定的关系,而刘家族占领比较大江山,特别刘厉山是刘望王子的叔叔,更为现任皇帝的弟弟,可见得岳跃利扮演的定北侯和皇上有着一定关联为同族关……乔家的儿女乔四美哪集怀孕,乔家的儿女乔四美演员家庭剧《乔家的儿女》提前进行铺设好乔四美发生的爱情,不过要开展恋情十分美好,造成有怀孕的情况产生,使得家庭变得更加完美的展现到观众眼前,由此能感觉宋祖儿把乔四美的角色表现很好。……禁闭岛结局什么意思剧情简介小李子是一个精神病人?禁闭岛结局什么意思:剧情简介小李子是一个精神病人?禁闭岛是一部拍摄于2010年的电影,这部电影在豆瓣上的评分高达8。6分,整个剧情的安排非常压抑,时空错乱干非常的强!有点……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网