增強for循環對遍歷的集合進行增刪改操作會出現並發修改異常


import lombok.Data;

import java.util.ArrayList;
import java.util.List;

/**
 * @author huQi
 * @email
 * @data 2021/2/9 17:46
 */
public class test {
    public static void main(String[] args) {
        List<Student> a = new ArrayList<Student>();
        for (int i = 0; i < 10; i++) {
            Student student = new Student();
            student.setAge(i);
            student.setName("huqi");
            a.add(student);
        }
        for (Student student : a) {
            if (student.getAge().intValue() == 2) {
                //使用增強for循環的時候對遍歷的集合進行增刪改操作會出現並發修改異常
                a.remove(student);
            }
        }

        System.out.println(a.toString());

    }
}

@Data
class Student {
    Integer age;
    String name;
}

以上示例正確寫法用普通for循環或者用java 8提供的removeif,或者使用線程安全的集合

示例代碼

import lombok.Data;

import java.util.ArrayList;
import java.util.List;

/**
 * @author huQi
 * @email
 * @data 2021/2/9 17:46
 */
public class test {
    public static void main(String[] args) {
        List<Student> a = new ArrayList<Student>();
        for (int i = 0; i < 10; i++) {
            Student student = new Student();
            student.setAge(i);
            student.setName("huqi");
            a.add(student);
        }
        //正確寫法
        a.removeIf(s -> s.getAge() == 2);

        System.out.println(a.toString());

    }
}

@Data
class Student {
    Integer age;
    String name;
}

線程安全的集合

        Collection<Student> list = Collections.synchronizedCollection(new ArrayList<Student>());
        List<Student> list1 = new CopyOnWriteArrayList<>();
        List<Student> list2 =new Vector<>();

 

總結:

Iterator是工作在一個獨立的線程中,並且擁有一個 mutex鎖,就是說Iterator在工作的時候,
是不允許被迭代的對象被改變的。Iterator被創建的時候,建立了一個內存索引表(單鏈表),
這 個索引表指向原來的對象,當原來的對象數量改變的時候,這個索引表的內容沒有同步改變,
所以當索引指針往下移動的時候,便找不到要迭代的對象,於是產生錯 誤。List、Set等是動態的,
可變對象數量的數據結構,但是Iterator則是單向不可變,只能順序讀取,不能逆序操作的數據結構,
當 Iterator指向的原始數據發生變化時,Iterator自己就迷失了方向。

 


免責聲明!

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



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