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自己就迷失了方向。