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”,怎么会有这个异常!
解决方案 »
- Java 对象序列化,有疑问?
- 使用java excel AIP 往 excel中写数据 如何确定 cell 中小位数的长度?
- 如何在JTable中按回车键即可直接从一个Cell的编辑状态进入到下一个Cell的编辑状态!!!
- 如何用java来判断一个文件有多少行?
- 关于JAVA随机数产生
- 【关于线程】new NewThread();和NewThread ob1=new NewThread();的区别在哪里???
- 怎样配置jCreator?
- java报表问题
- 问个我自己都感到弱智的问题,是一道SCJP的题
- 关于LinkedHashMap的加载因子和初始容量分配
- JButton.getInputMap问题
- classpath中的迷惑你解开了吗?
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本身的结构修改)