5、迭代器循环迭代器删除(可靠)
/** * 迭代器循环删除(iterator.remove) * @author: 栈长 * @from: 公众号Java技术栈 */ @Test public void remove4() { List<String> list = new ArrayList(initList); for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) { String str = iterator.next(); if (str.contains("李")) { iterator.remove(); } } System.out.println(list); }
输出结果:
[张三, 周一, 刘四]
结果输出正常,这是因为迭代器中的 remove 方法将期待修改的数量(expectedModCount)值进行了同步:
所以,这种删除方法是安全的,推荐使用。
6、迭代器循环集合删除(抛异常)
/** * 迭代器循环删除(list.remove) * @author: 栈长 * @from: 公众号Java技术栈 */ @Test public void remove5() { List<String> list = new ArrayList(initList); for (Iterator<String> ite = list.iterator(); ite.hasNext(); ) { String str = ite.next(); if (str.contains("李")) { list.remove(str); } } System.out.println(list); }
输出结果:
又是那个并发修改异常,这个示例虽然使用了 Iterator 循环,但删除的时候却使用了 list.remove 方法,同样是有问题的,注意了,千万别用错了。
7、集合 forEach 方法循环删除(抛异常)
/** * list.forEach 删除 * @author: 栈长 * @from: 公众号Java技术栈 */ @Test public void remove6() { List<String> list = new ArrayList(initList); list.forEach((e) -> { if (e.contains("李")) { list.remove(e); } }); System.out.println(list); }
输出结果:
forEach 源码:
forEach 方法的背后其实就是增强的 for 循环,底层即迭代器,所以使用 list.remove 同样抛出 ConcurrentModificationException 异常。
8、stream filter 过滤(可靠)
/** * stream filter 过滤 * @author: 栈长 * @from: 公众号Java技术栈 */ @Test public void remove7() { List<String> list = new ArrayList(initList); list = list.stream().filter(e -> !e.startsWith("李")).collect(Collectors.toList()); System.out.println(list); }
输出结果:
[张三, 周一, 刘四]
Stream filter 的详细用法,栈长之前已经分享过:你还在遍历搜索集合?别逗了!Java 8 一行代码搞定,是真的优雅!,没看过的点回去看看吧。
这个方法即是利用了 Stream 的筛选功能,快速过滤所需要的元素,虽然不是进行集合删除,但达到了同样的目的,这种方法要更简洁吧。
本文所有完整示例源代码已经上传:
https://github.com/javastacks/javastack
欢迎 Star 学习,后面 Java 示例都会在这上面提供!
总结
本文总结了 8 种循环删除 List 元素的方法:
- 普通 for 循环删除(不可靠)
- 普通 for 循环提取变量删除(抛异常)
- 普通 for 循环倒序删除(可靠)
- 增强 for 循环删除(抛异常)
- 迭代器循环迭代器删除(可靠)
- 迭代器循环集合删除(抛异常)
- 集合 forEach 方法循环删除(抛异常)
- stream filter 过滤(可靠)
可靠、可行的方案也只有 3 种,正统的删除法也就 2 种,但也要注意别用错了方法,所以也理解那个小伙子说怎么搞都搞不定,估计也是走了不少弯路,或者没有找对方法吧。
你还知道哪些删除技巧?欢迎留言分享~
好了,今天的分享就到这里了,后面栈长会分享更多好玩的 Java 技术和最新的技术资讯,关注公众号Java技术栈第一时间推送,我也将主流 Java 面试题和参考答案都整理好了,点击Java面试库小程序进行刷题。
最后,留个话题:
怎么去除 List<String> 中的重复元素呢?
下期分享,等栈长写完,公众号Java技术栈第一时间推送,不要走开~