正確遍歷刪除List中的元素方法(推薦)
遍歷刪除List中的元素有很多種方法,當(dāng)運(yùn)用不當(dāng)?shù)臅r(shí)候就會(huì)產(chǎn)生問題。下面主要看看以下幾種遍歷刪除List中元素的形式:
1.通過增強(qiáng)的for循環(huán)刪除符合條件的多個(gè)元素
2.通過增強(qiáng)的for循環(huán)刪除符合條件的一個(gè)元素
3.通過普通的for刪除刪除符合條件的多個(gè)元素
4.通過Iterator進(jìn)行遍歷刪除符合條件的多個(gè)元素
/**
* 使用增強(qiáng)的for循環(huán)
* 在循環(huán)過程中從List中刪除元素以后,繼續(xù)循環(huán)List時(shí)會(huì)報(bào)ConcurrentModificationException
*/
public void listRemove() {
List<Student> students = this.getStudents();
for (Student stu : students) {
if (stu.getId() == 2)
students.remove(stu);
}
}
/**
* 像這種使用增強(qiáng)的for循環(huán)對(duì)List進(jìn)行遍歷刪除,但刪除之后馬上就跳出的也不會(huì)出現(xiàn)異常
*/
public void listRemoveBreak() {
List<Student> students = this.getStudents();
for (Student stu : students) {
if (stu.getId() == 2) {
students.remove(stu);
break;
}
}
}
/**
* 這種遍歷有可能會(huì)遺漏某個(gè)元素,因?yàn)閯h除元素后List的size在
* 變化,元素的索引也在變化,比如你循環(huán)到第2個(gè)元素的時(shí)候你把它刪了,
* 接下來你去訪問第3個(gè)元素,實(shí)際上訪問到的是原先的第4個(gè)元素。當(dāng)訪問的元素
* 索引超過了當(dāng)前的List的size后還會(huì)出現(xiàn)數(shù)組越界的異常,當(dāng)然這里不會(huì)出現(xiàn)這種異常,
* 因?yàn)檫@里每遍歷一次都重新拿了一次當(dāng)前List的size。
*/
public void listRemove2() {
List<Student> students = this.getStudents();
for (int i=0; i<students.size(); i++) {
if (students.get(i).getId()%3 == 0) {
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方法移除當(dāng)前對(duì)象,如果使用List的remove方法,則同樣會(huì)出現(xiàn)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();
}
/**
* 使用增強(qiáng)的for循環(huán)
* 在循環(huán)過程中從List中刪除元素以后,繼續(xù)循環(huán)List時(shí)會(huì)報(bào)ConcurrentModificationException
*/
public void listRemove() {
List<Student> students = this.getStudents();
for (Student stu : students) {
if (stu.getId() == 2)
students.remove(stu);
}
}
/**
* 像這種使用增強(qiáng)的for循環(huán)對(duì)List進(jìn)行遍歷刪除,但刪除之后馬上就跳出的也不會(huì)出現(xiàn)異常
*/
public void listRemoveBreak() {
List<Student> students = this.getStudents();
for (Student stu : students) {
if (stu.getId() == 2) {
students.remove(stu);
break;
}
}
}
/**
* 這種不使用增強(qiáng)的for循環(huán),每次重新獲取list的size遍歷的情況運(yùn)行時(shí)不會(huì)報(bào)錯(cuò),但是可能刪除的結(jié)果是錯(cuò)的。
*/
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中的元素方法(推薦)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Cache與Redis結(jié)合的使用方式
這篇文章主要介紹了Spring Cache與Redis結(jié)合的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Java中ArrayList去除重復(fù)元素(包括字符串和自定義對(duì)象)
本文主要介紹了Java中ArrayList去除重復(fù)元素(包括字符串和自定義對(duì)象)的方法。具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-03-03
Java 函數(shù)式編程要點(diǎn)總結(jié)
函數(shù)式編程并不是Java新提出的概念,其與指令編程相比,強(qiáng)調(diào)函數(shù)的計(jì)算比指令的計(jì)算更重要;與過程化編程相比,其中函數(shù)的計(jì)算可以隨時(shí)調(diào)用。Java8新引入函數(shù)式編程方式,大大的提高了編碼效率。本文將對(duì)涉及的對(duì)象等進(jìn)行統(tǒng)一的學(xué)習(xí)及記錄。2021-06-06
Java定時(shí)器例子_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
本文給大家分享了java定時(shí)器例子,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-05-05
一文掌握Spring中循環(huán)依賴與三級(jí)緩存
這篇文章主要介紹了Spring中循環(huán)依賴與三級(jí)緩存,Spring通過三級(jí)緩存解決了循環(huán)依賴,其中一級(jí)緩存為單例池,二級(jí)緩存為早期曝光對(duì)象earlySingletonObjects,三級(jí)緩存為早期曝光對(duì)象工廠(singletonFactories),本文結(jié)合實(shí)例代碼介紹的非常詳細(xì),需要的朋友參考下吧2023-09-09

