在迭代器Iterator中使用remove的注意事项
在使用Iterator迭代器对集合中的元素进行迭代时,如果调用了集合对象的remove()方法去删除元素,那么就会出现异常。就像下面这样。
package RemoveIterator;
import java.util.ArrayList;
import java.util.Iterator;
public class Demo01 {
public static void main(String[] args) {
ArrayList list=new ArrayList();
list.add("今天");
list.add("天气");
list.add("真好啊");
list.add("啊");
list.add("!!");
list.add("!!");
list.add("!!");
Iterator iterator=list.iterator();
while(iterator.hasNext()){
Object object=iterator.next();
if("啊".equals(object)){
list.remove(object);
}
}
System.out.println(list);
}
}
运行结果就是想下面这样,出现了并发修改异常ConcurrentModificationException。这个异常顾名思意:当打开 Iterator 迭代集合时,同时又在对集合进行修改。这个异常是迭代器对象抛出的,出现的原因是集合中删除了元素会导致迭代器预期的迭代次序发生改变,导致迭代器的结果不准确。
那么出现了问题,就会有相应的解决方案。接下来就提出两种解决方案:
一、从业务逻辑上讲只想将“啊”这个字符删除,至于后面还有多少字符我们并不关心,所以只需要找到这个字符后跳出循环不再迭代即可。在使用break语句跳出循环以后,由于没有继续使用迭代器对集合中的元素进行迭代,因此,集合删除元素对程序没有任何影响,也就不会像之前那样报错出现异常。实现代码如下:
运行以后的结果:
二、在使用迭代器对集合当中的数据元素进行操作时,如果要对集合当中指定的数据元素进行删除操作时,应使用迭代器当中指定的remove方法来对集合当中的数据元素进行删除操作,而不能够使用集合当中的remove方法。若使用集合当中的方法对数据进行删除操作的话,将坏破坏整个迭代器机制使得迭代器在之后的操作当中不在起作用。锁定的元素也会被删除,也不会出现异常。因此可以这样说,调用迭代器对象的remove()方法删除元素所导致的迭代次数变化,对于迭代器对象本身来说是可以做到提前预知的。实现代码如下:
运行结果下:
在这个方法二中要注意是的,如果在调用remove方法之前没有调用next是不合法的。会出现java.lang.IllegalStateException这样的错误
推荐阅读
-
设计模式中的迭代器模式在Cocoa Touch框架中的使用
-
iOS App设计模式开发中对迭代器模式的使用示例
-
Python中Iterator迭代器的使用杂谈
-
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
-
使用JS在浏览器中判断当前网络连接状态的几种方法
-
在Surface中IE浏览器触摸版和桌面版的设置使用技巧
-
iOS App设计模式开发中对迭代器模式的使用示例
-
设计模式中的迭代器模式在Cocoa Touch框架中的使用
-
在浏览器中实现图片粘贴的jQuery插件-- pasteimg使用指南
-
在IE8浏览器中添加使用SSL加密的Google搜索