浏览 1642 次
锁定老帖子 主题:移除集合元素问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-03-17
最后修改:2012-03-17
为了方便叙述,先写一个测试类,然后加入测试,看看哪种情况你也存在问题,欢迎大家都来晒问题,并给出问题分析 public class TestList { private List<Object> list = null; @Before public void init() { list = new ArrayList<Object>(); for (int i = 0; i < 10; i++) { list.add(new Object()); } } @After public void print(){ System.out.println(list.size()); for(Object str:list){ System.out.println(str); } } } 问题一:增强for循环移除list项,java.util.ConcurrentModificationException,不支持迭代移除 @Test public void testForLoop01() { /** * 增强的for循环遍历时候产生问题 * java.util.ConcurrentModificationException */ for (Object str : list) { list.remove(str); } } Console: 引用 9 java.lang.Object@209f4e java.lang.Object@1bac748 java.lang.Object@17172ea java.lang.Object@12f6684 java.lang.Object@f38798 java.lang.Object@4b222f java.lang.Object@b169f8 java.lang.Object@1a457b6 java.lang.Object@7a78d3 问题二:size本身变化,i比较的值存在问题 @Test public void testForLoop02(){ /** * size在变化导致移除产生问题 */ for(int i=0;i<list.size();i++){ list.remove(i); } } Console: 引用 5 java.lang.Object@209f4e java.lang.Object@1bac748 java.lang.Object@17172ea java.lang.Object@12f6684 java.lang.Object@f38798 问题三:问题依旧,list大小随着移除本身变化问题, @Test public void testForLoop03(){ int length=list.size(); for(int i=0;i<length;i++){ list.remove(i); } } Console: 引用 5 java.lang.Object@17172ea java.lang.Object@12f6684 java.lang.Object@f38798 java.lang.Object@4b222f java.lang.Object@b169f8 综上给出正确的方式 @Test public void testForLoop04(){ int length=list.size(); for(int i=length-1;i>=0;i--){ list.remove(i); } } Console: 引用 0 问题四:既然增强的for循环是调用的迭代器,存在问题是由于并发修改报的错,那么是否可以用并发工具集合避免这个问题,测试解决 @Test public void testCurrentCollection(){ list=new CopyOnWriteArrayList<Object>(); for (int i = 0; i < 10; i++) { list.add(new Object()); } for (Object str : list) { list.remove(str); } } Console: 引用 0 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-03-17
精神可嘉。。
|
|
返回顶楼 | |
发表时间:2012-03-17
iminto 写道 精神可嘉。。
这不是唱红歌 |
|
返回顶楼 | |
发表时间:2012-03-18
看一下《JAVA并发编程》,因为执行for each后,经过编译
还是以iterator的迭代方式进行的,hasNext(),长度改变就会有你说的问题出现了。 使用concurrent.CopyOnWriteArrayList就可以了 |
|
返回顶楼 | |
发表时间:2012-03-19
郑富成 写道 看一下《JAVA并发编程》,因为执行for each后,经过编译
还是以iterator的迭代方式进行的,hasNext(),长度改变就会有你说的问题出现了。 使用concurrent.CopyOnWriteArrayList就可以了 没表达好,那天写的时候就急着写出所有问题,我在最后的时候写了用集合并发解决 迭代有问题是由于里面不一致 final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); } |
|
返回顶楼 | |