1. 程式人生 > >使用CopyOnWriteArrayList可以在叠代時移除數據

使用CopyOnWriteArrayList可以在叠代時移除數據

array getname rgs als con odi lse add iter

如果使用ArrayList 則不能在叠代輸出的時候 刪除元素 否則 可能會造成死循環

1.如果在移除第一個之後 版本記錄號+1 期望版本記錄號不變 進入下一次while時,next() 去判斷 當前版本號和except版本號不同 throws Exception

2.如果在移除第二個之後 size-1變為2 ,當進入下一次循環 cursor 加1 此時cursor等於2 hasnext 去判斷cursor與 size 若相等則 while循環退出 不再讀取下一個 (cursor=0指向第一個 =1指向第二個...)

3.如果移除最後一個size由3變為2 再一次進入while hasnext cursor加1變為 3 ,不等於size 繼續循環 curosr 繼續加 size不變 curosr永遠大於size while 永遠循環

綜上 ArrayList 在叠代時不能移除數據
應使用CopyOnWriteArrayList

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;
public class CollectionModifyExceptionTest {
    public static void main(String[] args) {
        Collection<User> users = new CopyOnWriteArrayList<User>();

            //new ArrayList();
        users.add(new User("張三",28));   
        users.add(new User("李四",25));           
        users.add(new User("王五",31));   
        Iterator<User> itrUsers = users.iterator();
        while(itrUsers.hasNext()){
            System.out.println("aaaa");
            User user = (User)itrUsers.next();
            if("李四".equals(user.getName())){
                users.remove(user);
                //itrUsers.remove();
            } else {
                System.out.println(user);               
            }
        }
    }
}    

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;
public class CollectionModifyExceptionTest {
    public static void main(String[] args) {
        Collection<User> users = new CopyOnWriteArrayList<User>();

            //new ArrayList();
        users.add(new User("張三",28));   
        users.add(new User("李四",25));           
        users.add(new User("王五",31));   
        Iterator<User> itrUsers = users.iterator();
        while(itrUsers.hasNext()){
            System.out.println("aaaa");
            User user = (User)itrUsers.next();
            if("李四".equals(user.getName())){
                users.remove(user);
                //itrUsers.remove();
            } else {
                System.out.println(user);               
            }
        }
    }
}    

使用CopyOnWriteArrayList可以在叠代時移除數據