遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题。下面主要看看以下几种遍历删除List中元素的形式:

1.通过增强的for循环删除符合条件的多个元素

2.通过增强的for循环删除符合条件的一个元素

3.通过普通的for删除删除符合条件的多个元素

4.通过Iterator进行遍历删除符合条件的多个元素

  1. /**
  2. * 使用增强的for循环
  3. * 在循环过程中从List中删除非基本数据类型以后,继续循环List时会报ConcurrentModificationException
  4. */
  5. public void listRemove() {
  6. List<Student> students = this.getStudents();
  7. for (Student stu : students) {
  8. if (stu.getId() == 2)
  9. students.remove(stu);
  10. }
  11. }
  1. /**
  2. * 像这种使用增强的for循环对List进行遍历删除,但删除之后马上就跳出的也不会出现异常
  3. */
  4. public void listRemoveBreak() {
  5. List<Student> students = this.getStudents();
  6. for (Student stu : students) {
  7. if (stu.getId() == 2) {
  8. students.remove(stu);
  9. break;
  10. }
  11. }
  12. }
  1. /**
  2. * 这种不使用增强的for循环的也可以正常删除和遍历,
  3. * 这里所谓的正常是指它不会报异常,但是删除后得到的
  4. * 数据不一定是正确的,这主要是因为删除元素后,被删除元素后
  5. * 的元素索引发生了变化。假设被遍历list中共有10个元素,当
  6. * 删除了第3个元素后,第4个元素就变成了第3个元素了,第5个就变成
  7. * 了第4个了,但是程序下一步循环到的索引是第4个,
  8. * 这时候取到的就是原本的第5个元素了。
  9. */
  10. public void listRemove2() {
  11. List<Student> students = this.getStudents();
  12. for (int i=0; i<students.size(); i++) {
  13. if (students.get(i).getId()%3 == 0) {
  14. Student student = students.get(i);
  15. students.remove(student);
  16. }
  17. }
  18. }
    1. /**
    2. * 使用Iterator的方式可以顺利删除和遍历
    3. */
    4. public void iteratorRemove() {
    5. List<Student> students = this.getStudents();
    6. System.out.println(students);
    7. Iterator<Student> stuIter = students.iterator();
    8. while (stuIter.hasNext()) {
    9. Student student = stuIter.next();
    10. if (student.getId() % 2 == 0)
    11. stuIter.remove();//这里要使用Iterator的remove方法移除当前对象,如果使用List的remove方法,则同样会出现ConcurrentModificationException
    12. }
    13. System.out.println(students);
    14. }

如何正确遍历删除List中的元素,你会吗?的更多相关文章

  1. 正确遍历删除List中的元素方法(推荐)

    遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题.下面主要看看以下几种遍历删除List中元素的形式: 1.通过增强的for循环删除符合条件的多个元素 2.通过增强的for循环删除符合 ...

  2. 如何正确遍历删除List中的元素

    遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题.下面主要看看以下几种遍历删除List中元素的形式: 1.通过增强的for循环删除符合条件的多个元素 2.通过增强的for循环删除符合 ...

  3. 如何正确遍历删除List中的元素(普通for循环、增强for循环、迭代器iterator、removeIf+方法引用)

    遍历删除List中符合条件的元素主要有以下几种方法: 普通for循环 增强for循环 foreach 迭代器iterator removeIf 和 方法引用 其中使用普通for循环容易造成遗漏元素的问 ...

  4. 遍历删除List中的元素,会报错?

    经常会碰到遍历集合,然后删除里面的对象报错, 纠结半天, 百度了一下,有大神说不能用for-each,  for , 只能用迭代器,真的吗?  我就删成功了呢,看代码,请大神们指正! public s ...

  5. Java中如何优雅地删除List中的元素

    在工作中的许多场景下,我们都会使用到List这个数据结构,那么同样的有很多场景下需要删除List中的某一个元素或某几个元素,那么我们该如何正确无误地删除List中的元素的,今天我来教大家三种方式. 前 ...

  6. LintCode之删除链表中的元素

    题目描述 我的代码 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode n ...

  7. Java 删除ArrayList中重复元素,保持顺序

    // 删除ArrayList中重复元素,保持顺序          public static List<Map<String, Object>> removeDuplicat ...

  8. C#实现在foreach遍历中删除集合中的元素(方法总结)

    目录 方法一:采用for循环,并且从尾到头遍历 方法二:使用递归 方法三:通过泛型类实现IEnumerator 在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致 ...

  9. java在遍历列表的时候删除列表中某个元素

    在遍历list的时候需要删除其中的某些元素,不要用foreach遍历,需要用Iterator. List<String> list = new ArrayList<String> ...

随机推荐

  1. 解题报告 之 HDU5288 OO&#39; s Sequence

    解题报告 之 HDU5288 OO' s Sequence Description OO has got a array A of size n ,defined a function f(l,r) ...

  2. c语言-完全背包问题

    完全背包问题 问题:有N种物品和一个容量为V的背包,每种物品都有无限件可用.第i种物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 分 ...

  3. (updated on Mar 1th)Programming Mobile Applications for Android Handheld Systems by Dr. Adam Porter

    本作品由Man_华创作,采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.基于http://www.cnblogs.com/manhua/上的作品创作. Lab - Inte ...

  4. 设置Activity进入退出动画

    http://blog.csdn.net/tenpage/article/details/7792689 http://blog.csdn.net/lnb333666/article/details/ ...

  5. EasyDarwin开源流媒体服务器gettimeofday性能优化(3000万/秒次优化至8000万次/秒)

    -本文由EasyDarwin开源团队成员贡献 一.问题描述 Easydarwin中大量使用gettimeofday来获取系统时间,对系统性能造成了一定的影响.我们来做个测试: While(1) { G ...

  6. Redis 分布式锁的正确实现方式(转)

    _ 前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各 ...

  7. myeclipse查看项目在本地的路径

    打开myeclipse编译器,选择项目,右键:选择properties 在这一侧的搜索框中输入:resource Location即是项目的在本地的路径. 亲测好使.

  8. indexDB操作(部分方法不太会使用)

    <script type="text/javascript"> //打开数据库 function openDB(name,version){ var version = ...

  9. system调用命令行命令而不显示命令行窗口

    system调用命令行命令而不显示命令行窗口 通常用system调用命令行命令时都会弹出黑底白字的命令行窗口,下面的代码可以不显示弹出的命令行窗口. 代码如下 #pragma comment( lin ...

  10. 迁移学习算法之TrAdaBoost ——本质上是在用不同分布的训练数据,训练出一个分类器

    迁移学习算法之TrAdaBoost from: https://blog.csdn.net/Augster/article/details/53039489 TradaBoost算法由来已久,具体算法 ...