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

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

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

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

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

    /**
* 使用增强的for循环
* 在循环过程中从List中删除元素以后,继续循环List时会报ConcurrentModificationException
*/
public void listRemove() {
List<Student> students = this.getStudents();
for (Student stu : students) {
if (stu.getId() == 2)
students.remove(stu);
}
}
    /**
* 像这种使用增强的for循环对List进行遍历删除,但删除之后马上就跳出的也不会出现异常
*/
public void listRemoveBreak() {
List<Student> students = this.getStudents();
for (Student stu : students) {
if (stu.getId() == ) {
students.remove(stu);
break;
}
}
}
    /**
* 这种遍历有可能会遗漏某个元素,因为删除元素后List的size在
* 变化,元素的索引也在变化,比如你循环到第2个元素的时候你把它删了,
* 接下来你去访问第3个元素,实际上访问到的是原先的第4个元素。当访问的元素
* 索引超过了当前的List的size后还会出现数组越界的异常,当然这里不会出现这种异常,
* 因为这里每遍历一次都重新拿了一次当前List的size。
*/
public void listRemove2() {
List<Student> students = this.getStudents();
for (int i=; i<students.size(); i++) {
if (students.get(i).getId()% == ) {
Student student = students.get(i);
students.remove(student);
}
}
}
    /**
* 使用Iterator的方式也可以顺利删除和遍历
*/
public void iteratorRemove() {
List<Student> students = this.getStudents();
System.out.println(students);
Iterator<Student> stuIter = students.iterator();
while (stuIter.hasNext()) {
Student student = stuIter.next();
if (student.getId() % 2 == 0)
//这里要使用Iterator的remove方法移除当前对象,如果使用List的remove方法,则同样会出现ConcurrentModificationException
stuIter.remove();
}
System.out.println(students);
}
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; public class ListRemove { public static void main(String args[]) {
ListRemove lr = new ListRemove();
lr.listRemove();
lr.listRemoveBreak();
// lr.listRemove2();
// lr.iteratorRemove();
} /**
* 使用增强的for循环
* 在循环过程中从List中删除元素以后,继续循环List时会报ConcurrentModificationException
*/
public void listRemove() {
List<Student> students = this.getStudents();
for (Student stu : students) {
if (stu.getId() == 2)
students.remove(stu);
}
} /**
* 像这种使用增强的for循环对List进行遍历删除,但删除之后马上就跳出的也不会出现异常
*/
public void listRemoveBreak() {
List<Student> students = this.getStudents();
for (Student stu : students) {
if (stu.getId() == 2) {
students.remove(stu);
break;
}
}
} /**
* 这种不使用增强的for循环,每次重新获取list的size遍历的情况运行时不会报错,但是可能删除的结果是错的。
*/
public void listRemove2() {
List<Student> students = this.getStudents();
for (int i=0; i<students.size(); i++) {
if (students.get(i).getId()%2 == 0)
students.remove(i);
}
} /**
* 使用Iterator的方式也可以顺利删除和遍历
*/
public void iteratorRemove() {
List<Student> students = this.getStudents();
System.out.println(students);
Iterator<Student> stuIter = students.iterator();
while (stuIter.hasNext()) {
Student student = stuIter.next();
if (student.getId() % 2 == 0)
stuIter.remove();
}
System.out.println(students);
} private List<Student> getStudents() {
List<Student> students = new ArrayList<Student>() {
{
int i = 0;
while (i++ < 10) {
Student student = new Student(i, "201200" + i, "name_" + i);
this.add(student);
}
}
};
return students;
}
}
public class Student {

    private int id;
private String stuNo;
private String name; public Student() { } public Student(int id, String stuNo, String name) {
this.id = id;
this.stuNo = stuNo;
this.name = name;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getStuNo() {
return stuNo;
} public void setStuNo(String stuNo) {
this.stuNo = stuNo;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", stuNo=" + stuNo
+ "]";
} }

如何正确遍历删除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. 关系代数演算So Easy

    关系代数运算So Easy 关系代数是以关系为运算的一组高级运算的集合.由于定义为属性个数 相同的元组的集合,因此集合代数的操作就可以引入到关系代数中.关系代数也可以看做是一种抽象的查询语言,是对关系 ...

  2. JS中的作用域和作用域链

    本文原链接:https://cloud.tencent.com/developer/article/1403589 前言 作用域(Scope) 1. 什么是作用域 2. 全局作用域和函数作用域 3. ...

  3. jQuery JavaScript Library v3.2.1

    /*! * jQuery JavaScript Library v3.2.1 * https://jquery.com/ * * Includes Sizzle.js * https://sizzle ...

  4. js中异步方案比较完整版(callback,promise,generator,async)

    JS 异步已经告一段落了,这里来一波小总结 1. 回调函数(callback) setTimeout(() => { // callback 函数体 }, 1000) 缺点:回调地狱,不能用 t ...

  5. iOS深拷贝与浅拷贝

    概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 如图详解:

  6. Typescript学习(一)----准备篇(vscode编译ts文件)

    什么是typescript? typescript是微软开发的一个脚本语言.他是JavaScript的超级,他遵循es6语法规范,他扩展了JavaScript的语法. 理解es5,es6,javasc ...

  7. Python学习记录4(语句)

    赋值语句 序列解包 条件语句 语句块 布尔变量 条件执行和if语句 条件运算符 循环 while语句 for循环 迭代工具 跳出循环 break continue while truebreak语句 ...

  8. k8s资源指标API及metrics-server资源监控

    简述: 在k8s早期版本中,对资源的监控使用的是heapster的资源监控工具. 但是从 Kubernetes 1.8 开始,Kubernetes 通过 Metrics API 获取资源使用指标,例如 ...

  9. Linux常用文档操作命令--2

    4.文档压缩与解压操作 在Linux中常见的压缩文件有:*.tar.gz.*.tgz.*.gz.*.Z.*bz2等.其每种不同的压缩文件对印的压缩和解压命令也不同. *.tar.gz :tar程序打包 ...

  10. Springboot @Autowired 无法注入问题

    特别提醒:一定要注意文件结构 WebappApplication 一定要在包的最外层,否则Spring无法对所有的类进行托管,会造成@Autowired 无法注入. 1. 添加工具类获取在 Sprin ...