ArrayList<String> strList = new ArrayList<String>();
strList.add("1");
strList.add("4");
strList.add("4");
strList.add("2");
strList.add("5");
strList.add("5");
strList.add("7"); Iterator<String> it = strList.iterator();
while (it.hasNext()) {
String str = it.next();
if (str.equals("4") || str.equals("2")) {
it.remove();
}
if (str.equals("5")) {
it.remove();
strList.add("9");//这里出现ConcurrentModificationException异常
}
}把其中的“5”改成“9”,怎么会有这个异常!
strList.add("9");
要想实现操作,可以用一个临时的list来存放值,不能对迭代的list进行删除操作
迭代的时候不能执行添加、删除操作,该list是被同步了的
list可以不用迭代,直接循环的
List<String> list=(List<String>) strList.clone();
for(String str:list){
if (str.equals("4"))
strList.remove("4");
else if(str.equals("2"))
strList.remove("4");
if (str.equals("5")) {
strList.remove("5");
strList.add("9");
}
}
System.out.println(strList);
ListIterator<String> it = strList.listIterator();
...
if (str.equals("5")) {
it.remove();
it.add("9");//OK
}
Iterator是对其做应变好还是不应变好?应变的话,Iterator与集合之间须是实时联动,可能通过观察者模式的机制,(可能代价较高),能否让迭代顺利进行,这一点我相信能做到,因为其支持Iterator本身的add remove操作不应变的话,就会挑战一致性,这个更严重,因此宁愿设定迭代时外界不可更改,这个虽然加少了一定适应性,但是换来的是性能和更高的可操作性(只提供Iterator本身的结构修改)