目录

1、删除List

2、删除Set

3、删除Map

注意事项:


1、删除List

public class ListDemo {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张三");list.add("李四");list.add("王五");list.add("赵六");list.forEach(System.out::println);for(String str : list) {if ("李四".equals(str)) {list.remove(str);}}list.forEach(s -> {System.out.println("第1次删除后:" + list);});}
}

以上代码运行会发生并发修改异常ConcurrentModificationException,正确的方式是:

public class ListExample {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张三");list.add("李四");list.add("王五");list.add("赵六");System.out.println(list);// 方法1:迭代器遍历Iterator<String> iterator = list.iterator();while(iterator.hasNext()) {String s = iterator.next();if ("李四".equals(s)) {iterator.remove();}}System.out.println("第1次删除后:" + list);// 方法2:使用集合的removeIf()方法list.removeIf(new Predicate<String>() {@Overridepublic boolean test(String s) {return "王五".equals(s);}});System.out.println("第2次删除后:" + list);}
}

2、删除Set

同样,Set也不能通过foreach删除,否则发生异常

public class SetExample {public static void main(String[] args) {Set<String> set = new HashSet<>();set.add("张三");set.add("李四");set.add("王五");System.out.println(set);// 此处会发生并发修改异常for(String str : set) {if ("张三".equals(str)) {set.remove(str);}}System.out.println("第1次删除后:" + set);set.removeIf("李四"::equals);System.out.println("第2次删除后:" + set);}
}

3、删除Map

public static void main(String[] args) {Map<Integer, String> map = new HashMap();map.put(1, "张三");map.put(2, "李四");map.put(3, "王五");map.put(4, "赵六");map.forEach((k, v) -> System.out.println(k + "," + v));Iterator<Map.Entry<Integer, String>> iterator = map.entrySet().iterator();while(iterator.hasNext()) {Map.Entry<Integer, String> entry = iterator.next();Integer key = entry.getKey();if (key == 1) {iterator.remove();}}System.out.println(map);
}

注意事项:

使用普通for循环删除list里面的元素会有bug,当删除一个元素时,list的长度会减1,被删除元素的后一个元素会向前移动,导致只删了一部分符合条件的元素。

public class ListExample {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张三");list.add("张三");list.add("李四");list.add("王五");list.add("赵六");System.out.println("删除前:" + list);for (int i = 0; i < list.size(); i++) {String s = list.get(i);if ("张三".equals(s)) {list.remove(s);}}System.out.println("删除后:" + list);}}

以上代码的运行结果为:

删除前:[张三, 张三, 李四, 王五, 赵六]
删除后:[张三, 李四, 王五, 赵六]

原因是:

第一轮循环,i = 0,会删除第一个张三,删除之后只剩四个元素[张三, 李四, 王五, 赵六]

第二轮循环,i = 1,从第二个元素(也就是“李四”)开始判断

以上代码可以简单的改成如下,每次都比较第一个元素

public class ListExample {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张三");list.add("张三");list.add("李四");list.add("王五");list.add("赵六");System.out.println("删除前:" + list);for (int i = 0; i < list.size(); i++) {String s = list.get(0);if ("张三".equals(s)) {list.remove(s);}}System.out.println("删除后:" + list);}}

事实上Collection的removeIf()方法的实现也是通过Iterator的romove()方法删除元素,源码如下:

default boolean removeIf(Predicate<? super E> filter) {Objects.requireNonNull(filter);boolean removed = false;final Iterator<E> each = iterator();while (each.hasNext()) {if (filter.test(each.next())) {each.remove();removed = true;}}return removed;
}

答疑环节:

那有童鞋就要问了,foreach遍历删除会发生异常,为什么普通for循环就能正常运行呢?

因为foreach也会被编译成迭代器遍历的方式,只不过调用的是集合的remove()方法,没有调用迭代器的remove()导致的异常。

foreach编译前:

public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张三");list.add("张三");list.add("李四");list.add("王五");list.add("赵六");System.out.println("删除前:" + list);for (String s : list) {if ("张三".equals(s)) {list.remove(s);}}System.out.println("删除后:" + list);}

foreach编译后:

public static void main(String[] args) {List<String> list = new ArrayList();list.add("张三");list.add("张三");list.add("李四");list.add("王五");list.add("赵六");System.out.println("删除前:" + list);Iterator var2 = list.iterator();while(var2.hasNext()) {String s = (String)var2.next();if ("张三".equals(s)) {list.remove(s);}}System.out.println("删除后:" + list);
}

如果还想更深入了解为什么会发生异常,可以参考文章Java集合的快速失败原则

文章总结:

使用迭代器的remove()方法删除就可以了

Java集合如何遍历删除指定元素相关推荐

  1. java集合的遍历删除

    java集合的遍历删除. 案例 使用普通for循环遍历集合 //以下代码不会有任何问题List<Integer> list = new ArrayList();list.add(1);li ...

  2. Java基础361问第4问——List如何遍历删除指定元素

    这道题是面百度时的一个问题,也是一道很经典的题目 给定一个整数集合{1,2,2,3,4},删除其中能够被2整除的元素(即最后集合变为{1,3}) 看到这个问题,我开始觉得很简单 for (int i ...

  3. Java 集合中遍历删除元素抛异常的原因,从ArrayList说起

    文章目录 使用for删除遗漏元素的原因: 使用foreach删除报错的原因: 其它集合的删除方法 删除集合元素的工具类 ArrayList删除元素的方式. 使用for循环删除.会遗漏删除的元素 使用f ...

  4. Java 集合List遍历删除

    循环遍历需要从最后索引开始!!! public static void main(String[] args) {List<Integer> list = new ArrayList< ...

  5. Java 集合List、Set、HashMap操作二(Map遍历、List反向、Set删除指定元素,集合只读、TreeMap操作、List转Array、List移动元素)

    Map遍历 import java.util.Map; import java.util.HashMap; import java.util.HashSet; import java.util.Ite ...

  6. java list移除符合条件的元素_java List删除指定元素的三种方法

    java List删除指定元素有3种方法,分别是普通for循环,增强for循环以及原生的Iterator迭代器循环来删除list中指定的某个元素,非常的简单. 1:普通for循环遍历list,并删除指 ...

  7. java中List遍历删除元素

    删除末尾几个元素 import java.util.LinkedList; import java.util.List;public class TestList {public static voi ...

  8. 从List集合中删除指定元素

    从List集合中删除指定元素的几种方式 最近在使用这个操作的时候搜索了一下网上的文章,发现有些能用有些不能用, 由于使用之前没有做详细的测试,导致程序bug,今天抽空做了一下总结和测试. packag ...

  9. Redis中有序集合zset数据类型(增加(添加元素)、获取(获取指定范围元素、返回权值在min和max之间的成员、返回成员member的score值)、删除(删除指定元素和指定权值范围的元素))

    sorted set,有序集合 元素为string类型 元素具有唯⼀性,不重复   [值不能重复] 每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从⼩到⼤排序 说明:没有修 ...

最新文章

  1. Numpy入门教程:10. 统计相关
  2. FAST选址与三维仿真模拟研究
  3. 集大通100%任务完成度签到
  4. .NET Core IdentityServer4实战 第二章-OpenID Connect添加用户认证
  5. 创业公司,没有好领导,有多少人才都是死路一条
  6. python脚本在linux上运行的两种方式_python脚本当作Linux中的服务启动实现方法
  7. 数仓出现“wait in ccn queue”的时候,怎么迅速定位处理?
  8. 【算法】弗洛伊德算法 最短路径算法
  9. gperftools
  10. 手把手带你了解安卓Unity3D手游
  11. C程序设计--VC++6.0的使用(常用快捷键)
  12. 笨笨-歌词伴侣V1.2(酷狗KRC转LRC,LRC歌词批量下载)
  13. Python数据字典处理Excel,并统计总数,画出饼图
  14. 小米 信号测试软件,小米WiFi测试版
  15. 从高中编码员到国际技术演讲者— Arun Michael Dsouza访谈
  16. 学习云计算有什么用处 该怎么学好云计算技术
  17. 全自动爬虫,你爱了么
  18. 利用selenium库实现QQ空间点赞
  19. 华为优招面经(已拿offer)
  20. 9个offer,12家公司

热门文章

  1. 移动应用表单设计秘籍
  2. DM数据库网络通信异常排查
  3. java fileinputstream转换字节流_FileInputStream输入字节流
  4. 常用的函数式接口--Consumer接口
  5. 20060627: “感冒通”今何在
  6. 解决 VS 出现错误 MSB3644 找不到 .NETFramework,Version=v4.6.1 的引用程序集。要解决此问题,请为此框架版本安装......
  7. 酷睿i9“出山大典”之后,游戏玩家与内容创作用户都笑了……
  8. 如何在线录制视频?教您一个简单的方法!
  9. 二维,三维坐标旋转,左右手坐标系
  10. 倪文迪陪你学蓝桥杯2021寒假每日一题:1.26日(2019省赛A组第4题)