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 }
View Code

下面我们来分析下我们这段代码

  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循环

Java中Set集合怎样用for遍历?

java iterator循环遍历集合(比如HashSet)的原理

java怎么循环遍历ArrayList

java 中 iterator 为啥翻译成迭代器呢