易错问题
来源:互联网 发布:网络棋牌平台杀分 编辑:程序博客网 时间:2024/05/17 23:47
1 遍历一个ArrayList去查找某项是否存在,如果存在的话就从列表中删除,方法如下:
- for(Person p : persons){
- if(p.getName().equals(name))
- persons.remove(p);
- }
for(Person p : persons){ if(p.getName().equals(name)) persons.remove(p); }
结果出现java.util.ConcurrentModificationException错误
原因: jdk5.0以上的for-each也是利用内部的iterator来遍历集合的(跟以前的iterator一样)获得的Iterator是一个内部类产生的迭代器,这个迭代器在调用next方法时,会检查列表是否被修改过,如果被修改过,就会抛出ConcurrentModificationException异常。进一步说,当使用 fail-fast iterator 对 Collection 或 Map 进行迭代操作过程中尝试直接修改 Collection / Map 的内容时,即使是在单线程下运xi,java.util.ConcurrentModificationException 异常也将被抛出。Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。 所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象,Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。
Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。
解决方法1:
- //使用java.util.Iterator
- for(Iterator it = list.iterator(); it.hasNext();){
- Integer i = (Integer)it.next();
- it.remove();
- }
//使用java.util.Iterator for(Iterator it = list.iterator(); it.hasNext();){ Integer i = (Integer)it.next(); it.remove(); }
解决方法2:
- for(int i = 0; i<persons.size(); i++){
- if(persons.get(i).getName().equals(name))
- persons.remove(i);
- }
for(int i = 0; i<persons.size(); i++){ if(persons.get(i).getName().equals(name)) persons.remove(i); }
方法2不适合大型数组
- 常见易错问题
- 易错问题
- js易错问题
- 嵌套调用易错问题
- 易错的指针问题
- ORACLE+UNIX易错问题集锦
- 抽象工厂配置易错问题
- 边界等相关细节易错问题
- C/C++易错问题分析
- javaweb常见易错问题大汇总
- javaweb常见易错问题大汇总
- 一个易错的while循环问题
- 【C++复习】易错的小问题
- [问题]易语言画板重画问题
- 易出错问题汇总
- 易信的问题
- 装错信封问题
- delete[] 报错问题
- SQL语句:group by having
- Mysql分区
- JAVA 继承基本类、抽象类、接口
- linux USB子系统之我的见解。
- Android Dialog和adapter关联,列表形式显示对话框
- 易错问题
- 我的新书《HTML5 Canvas游戏开发实战》
- 在IOS中实现导入&导出文档
- 对apk进行签名的方法
- C++ 多线程开发技巧 4
- awk 中if 的 用法
- 新九州 -- 对知识库的内容进行编辑
- 编译时系统的环境变量
- Core Animation学习笔记一:CATransactions