正確遍歷刪除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-12Java中ArrayList去除重復(fù)元素(包括字符串和自定義對(duì)象)
本文主要介紹了Java中ArrayList去除重復(fù)元素(包括字符串和自定義對(duì)象)的方法。具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-03-03Java 函數(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-06Java定時(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