集合ArrayList遍历修改问题
2016-11-23 13:03
351 查看
关于集合ArrayList的遍历修改问题:
/**
* 一个ArrayList对象aList中存有若干个字符串元素,
* 现欲遍历该ArrayList对象,删除其中所有值为"abc"的字符串元素
*/
import java.util.*;
public class Test3 {
public static void main(String[] args) {
ArrayList<String> aList=new ArrayList<String>();
aList.add("bbc");
aList.add("abc");
aList.add("ysc");
aList.add("abc");
aList.add("xyza");
aList.add("abc");
System.out.println("移除前:"+aList);
Iterator<String> it=aList.iterator();
while(it.hasNext()){
if("abc".equals(it.next()))
it.remove();
}
System.out.println("移除后:"+aList);
}
}void remove()从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。每次调用 next 只能调用一次此方法。如果进行迭代时用调用此方法之外的其他方式修改了该迭代器所指向的
collection,则迭代器的行为是不确定的。
1.迭代器是作为当前集合的内部类实现的,当迭代器创建的时候保持了当前集合的引用;
2.集合内部维护一个字段叫modiCount,用来记录集合被修改的次数,比如add,remove,set等都会使该字段递增;
3.迭代器内部也维护着当前集合的修改次数的字段,迭代器创建时该字段初始化为集合的modiCount值
4.当每一次迭代时,迭代器会比较迭代器维护的字段和modiCount的值是否相等,如果不相等就抛ConcurrentModifiedException异常;
5.当然,如果用迭代器调用remove方法,那么集合和迭代器维护的修改字数都会递增,以保持两个状态的一致。
这就是为什么你只可以用迭代器来删除,而不能用其他方式来修改集合。
/**
* 一个ArrayList对象aList中存有若干个字符串元素,
* 现欲遍历该ArrayList对象,删除其中所有值为"abc"的字符串元素
*/
import java.util.*;
public class Test3 {
public static void main(String[] args) {
ArrayList<String> aList=new ArrayList<String>();
aList.add("bbc");
aList.add("abc");
aList.add("ysc");
aList.add("abc");
aList.add("xyza");
aList.add("abc");
System.out.println("移除前:"+aList);
Iterator<String> it=aList.iterator();
while(it.hasNext()){
if("abc".equals(it.next()))
it.remove();
}
System.out.println("移除后:"+aList);
}
}void remove()从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。每次调用 next 只能调用一次此方法。如果进行迭代时用调用此方法之外的其他方式修改了该迭代器所指向的
collection,则迭代器的行为是不确定的。
1.迭代器是作为当前集合的内部类实现的,当迭代器创建的时候保持了当前集合的引用;
2.集合内部维护一个字段叫modiCount,用来记录集合被修改的次数,比如add,remove,set等都会使该字段递增;
3.迭代器内部也维护着当前集合的修改次数的字段,迭代器创建时该字段初始化为集合的modiCount值
4.当每一次迭代时,迭代器会比较迭代器维护的字段和modiCount的值是否相等,如果不相等就抛ConcurrentModifiedException异常;
5.当然,如果用迭代器调用remove方法,那么集合和迭代器维护的修改字数都会递增,以保持两个状态的一致。
这就是为什么你只可以用迭代器来删除,而不能用其他方式来修改集合。
相关文章推荐
- java 集合(arraylist set map)遍历问题
- 遍历ArrayList时同时修改引发的问题
- 解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合”的问题
- WinForm下ListBox控件“设置DataSource属性后无法修改项集合”的问题解决方案
- 黄聪:C#使用能够foreach对hashtable、List遍历时“集合已修改;可能无法执行枚举操作。”错误
- 多线程14-遍历集合时删除元素问题分析
- Java集合01----ArrayList的遍历方式及应用
- 解决: 集合已修改,枚举操作可能不会执行问题
- 黑马程序员(笔试题)遍历一个ArrayList集合,如果这个集合有多个“abc”则全部删除掉
- C# LIstbox 解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合”的问题
- C#中DataGridView绑定了DataTable后,通过代码修改DataGridView中的数据,总有一行(被修改过并被用户选中的行集合中索引为0的行)不能被UpDate回数据库的问题和解决办法
- javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题
- 集合 List ArrayList 问题
- List集合两种遍历效率问题
- 用迭代器取出ArrayList集合集合中的元素。(用for和while正反向遍历)
- ArrayList的遍历删除问题
- ArrayList的问题(迭代的时候不允许修改)
- 解决WinForm中ComboBox控件的“设置"DataSourse”属性后无法修改项集合”以及两个不相关联的ComboxBox控件实现数据列表显示不可实现的问题
- Java:集合,Array、Collection(List/Set/Queue)、Map的遍历,比如:ArrayList,LinkedList,HashSet,HashMap
- 针对:Arraylist集合无法修改,下一次枚举无法操作的解决方案