正確遍歷刪除List中的元素方法(推薦)


遍歷刪除List中的元素有很多種方法,當運用不當的時候就會產生問題。下面主要看看以下幾種遍歷刪除List中元素的形式:

1.通過增強的for循環刪除符合條件的多個元素

2.通過增強的for循環刪除符合條件的一個元素

3.通過普通的for刪除刪除符合條件的多個元素

4.通過Iterator進行遍歷刪除符合條件的多個元素

1
2
3
4
5
6
7
8
9
10
11
/**
    * 使用增強的for循環
    * 在循環過程中從List中刪除元素以后,繼續循環List時會報ConcurrentModificationException
    */
   public void listRemove() {
     List<Student> students = this .getStudents();
     for (Student stu : students) {
       if (stu.getId() == 2 )
         students.remove(stu);
     }
   }
1
2
3
4
5
6
7
8
9
10
11
12
/**
    * 像這種使用增強的for循環對List進行遍歷刪除,但刪除之后馬上就跳出的也不會出現異常
    */
   public void listRemoveBreak() {
     List<Student> students = this .getStudents();
     for (Student stu : students) {
       if (stu.getId() == 2 ) {
         students.remove(stu);
         break ;
       }
     }
   }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
    * 這種遍歷有可能會遺漏某個元素,因為刪除元素后List的size在
    * 變化,元素的索引也在變化,比如你循環到第2個元素的時候你把它刪了,
    * 接下來你去訪問第3個元素,實際上訪問到的是原先的第4個元素。當訪問的元素
    * 索引超過了當前的List的size后還會出現數組越界的異常,當然這里不會出現這種異常,
    * 因為這里每遍歷一次都重新拿了一次當前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);
       }
     }
   }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
    * 使用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);
   }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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;
   }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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
         + "]" ;
   }
   
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM