Java Collection 移除元素方法及注意事项
1.前言
操作集合是一个Java编程人员几乎每天都在重复的事情。今天我们来研究一下从JavaCollection中删除元素的方法。我构建了一个简单的集合,我们以此为例子来展开探索。
Listservers=newArrayList<>(); servers.add("Felordcn"); servers.add("Tomcat"); servers.add("Jetty"); servers.add("Undertow"); servers.add("Resin");
2.for循环并不一定能从集合中移除元素
让我们使用传统的foreach循环移除F开头的假服务器,但是你会发现这种操作引发了ConcurrentModificationException异常。
//错误的示范千万不要使用 for(Stringserver:servers){ if(server.startsWith("F")){ servers.remove(server); } }
难道for循环就不能移除元素了吗?当然不是!我们如果能确定需要被移除的元素的索引还是可以的。
//这种方式是可行 for(inti=0;i但是这种方式我目前只演示了ArrayList,其它的类型并没有严格测试,留给你自己探索。
3.迭代器Iterator可以删除集合中的元素
在传统方式中我们使用Iterator是可以保证删除元素的:
Iteratoriterator=servers.iterator(); while(iterator.hasNext()){ Stringnext=iterator.next(); if(next.startsWith("F")){ iterator.remove(); } } 4.遍历删除元素的缺点
- 我们需要遍历集合的每一个元素并对它们进行断言,哪怕你删除一个元素。
- 尽管我们可以通过迭代的方式删除特定的元素,但是操作繁琐,根据集合类型的不同有潜在的ConcurrentModificationException异常。
- 根据数据结构的不同,删除元素的时间复杂度也大大不同。比如数组结构的ArrayList在删除元素的速度上不如链表结构的LinkedList。
5.新的集合元素删除操作
Java8提供了新的集合操作API和Stream来帮助我们解决这个问题。我在以前的文章中已经介绍了Java8StreamAPI,如果有兴趣可以去看看。
5.1Collection.removeIf()
新的CollectionApiremoveIf(Predicatefilter)。该Api提供了一种更简洁的使用Predicate(断言)删除元素的方法,于是我们可以更加简洁的实现开始的需求:
servers.removeIf(s->s.startsWith("F"));
同时根据测试,ArrayList和LinkedList的性能接近。一般推荐使用这种方式进行操作。
5.2Stream实现移除元素
和上面所有移除操作不同的是,其实任何操作都不会改变Stream源,我们仅仅是使用StreamApi操作数据源的副本。遵循了数据源->中间操作->归纳终止的生命周期。我们来看看使用Stream如何实现我们的意图。
5.2.1通过filter断言实现
我们可以使用Stream的filter断言。filter断言会把符合断言的流元素汇集成一个新的流,然后归纳起来即可,于是我们可以这么写:
//跟以上不同的是该方式中的断言是取反的操作。 ListnewServers=servers.stream().filter(s->!s.startsWith("F")).collect(Collectors.toList()); 这个优点上面已经说了不会影响原始数据,生成的是一个副本。缺点就是可能会有内存占用问题。
5.2.2通过Collectors.partitioningBy归纳
这种方法虽然可以满足需要但是我感觉有点投机取巧的成份。Collectors.partitioningBy()方法本意是做二分类的。该方法会将流中符合断言的、不符合断言的元素分别归纳到两个key分别为true和false的Map中,我们可以归类得到符合和不符合的元素集。实现如下:
Map>f=servers.stream().collect(Collectors.partitioningBy(s->!s.startsWith("F"))); List trues=f.get(Boolean.TRUE); System.out.println("不以F开头的:"+trues); List falses=f.get(Boolean.FALSE); System.out.println("以F开头的:"+falses); 一般该方式不推荐在此场景使用,并不符合该Api的设计意图。
6.总结
今天我们研究了一些从Collections中删除元素的方法及其注意事项。希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。