java容器中遍历循环Iterator 和 Foreach 循环
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java容器中遍历循环Iterator 和 Foreach 循环相关的知识,希望对你有一定的参考价值。
最近遇到这样一个问题,要删除一个集合中的某个元素,该怎么解决?
我自己写了两段代码来删除,都报了一个错java.util.ConcurrentModificationException;为了让更多可能没注意到这个点的程序猿注意一下,我在这里分享下~
先看代码
1 package com.zwt1234; 2 3 import java.util.HashSet; 4 import java.util.Iterator; 5 import java.util.Set; 6 7 public class IteratorTest { 8 public static void main(String[] args) { 9 Set<Object> s = new HashSet<Object>(0); 10 s.add(new Man("小明", 12)); 11 s.add(new Man("小李", 15)); 12 s.add(new Man("小华", 21)); 13 validateIterator(s); 14 // validateForeach(s); 15 } 16 17 /** 18 * 验证Iterator接口的方法 19 * iterator进入循环后,相当于线程上了一把锁,谁都不让进,只能用iterator自己的对象操作数据 20 * 因此下面用s.remove(man)是,程序报错 21 * @param s 22 */ 23 public static void validateIterator(Set<Object> s) { 24 Iterator<Object> iter = s.iterator(); 25 while (iter.hasNext()) { 26 Man man = (Man)iter.next(); 27 System.out.println(man); 28 if (man.name.equals("小李")) { 29 iter.remove(); 30 // s.remove(man);//此时程序报错java.util.ConcurrentModificationException 31 } 32 } 33 System.out.println("------------------------"); 34 /* 35 * 执行上面删除操作后重新打印s集合中元素,印证操作 36 */ 37 iter = s.iterator(); 38 while (iter.hasNext()) { 39 System.out.println(iter.next()); 40 } 41 } 42 43 /** 44 * 验证foreach循环 45 * foreach循环相对iterator在查询上面更加方便了,因为代码量少了; 46 * 但是在岁数据操作上面比不过iterator 47 * @param s 48 */ 49 public static void validateForeach(Set<Object> s) { 50 for (Object obj:s) { 51 Man man = (Man)obj; 52 System.out.println(man); 53 if (man.name.equals("小李")) { 54 s.remove(man);//这里同样是不让删除的,因为foreach循环底层就是用的iterator的实现方式 55 } 56 } 57 } 58 } 59 60 class Man { 61 String name; 62 int age; 63 64 Man(String name, int age) { 65 this.name = name; 66 this.age = age; 67 } 68 69 @Override 70 public String toString() { 71 return "Man [name=" + name + ", age=" + age + "]"; 72 } 73 }
下面我们来分析下我们这段代码
1.首先我用,Iterator来实现的删除,开始的时候,在遍历到存入的对象名为小李的时候,我就让这个对象,在Set集合s中删除,在if语句里面,面对2个问题,集合s有给我们提供一个remove()方法,还有iterator也给我们提供了一个remove()方法,我们用哪个?
最开始的时候我选用的是Set集合给的方法,可是在运行的时候,结果就报错了,而改用iterator提供的方法是可以正确运行的,正常删除了我所需要删除的对象。
结果总结:说明在使用iterator迭代器的时候,我们需要删除集合中数据,使用的应该是Iterator的remove()方法,因为使用iterator的时候,就相当于给线程给资源上了一把锁,只有iterator本身可以去删除数据,而集合线程是无法在iterator占用资源的时候对资源进行删除的。
2.同样的foreach增强for循环的实现删除的时候,我也去实现了下。
因为foreach循环没有给我们提供remove()方法,因此我们直接使用Set集合里面给我们提供的删除方法,发现也是会报和iterator同样的错误,因此,证明foreach循环是不适合进行数据的删除的。
(对于上面的代码操作结果,就请大家copy一下,直接运行就能查看结果了,这里我就不展示了)
3.最后总结:①相比于foreach,迭代器iterator的使用略显繁琐;
②相比于foreach,迭代器iterato在对数据的操控显然比foreach要灵活。
最后的最后,上面的总结知识博主自己的个人见解,有不周到的地方,或者错误的地方,请大家指正,谢谢~
以上是关于java容器中遍历循环Iterator 和 Foreach 循环的主要内容,如果未能解决你的问题,请参考以下文章
java容器中遍历循环Iterator 和 Foreach 循环
java 数据结构:Iterator接口与foreach循环