使用CopyOnWriteArrayList可以在叠代時移除數據
阿新 • • 發佈:2018-08-24
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可以在叠代時移除數據