集合框架-Iterator

一、Iterator接口是Java Collections Framework的成员,它对集合进行迭代,并且它代替了 Java Collections Framework 中的 Enumeration,两者有以下两点不同:

  1. Iterator允许调用方利用定义良好的语义在迭代期间从迭代器所指向的集合移除元素。
  2. 方法名称得到了改进。

这里写图片描述

二、Iterator方法介绍

  1. boolean hasNext() 如果存在可访问的元素,返回true。
  2. E next() 返回将要访问的下一个对象。如果已经到达集合的尾部,将抛出一个NoSuchElementException,因此需要在调用next()之前调用hasNext()。
  3. void remove() 删除上一次调用next()之后返回的元素。这个方法必须紧跟在访问一个元素之后执行。如果上次访问之后,集合已经发生了变化,这个方法将抛出一个IllegalStateException。
  4. forEachRemaining(Consumer< ? super E > action) 为每个剩余元素执行给定的操作,直到所有的元素都已经被处理或抛出一个异常。

三、使用迭代器遍历集合

  • 请求一个迭代器,并在hasNext()返回true时反复调用next(),可以遍历集合中的所有元素。
List<Integer> list = new ArrayList<Integer>();
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
    Integer element = it.next();
    //do something with element
}
  • 从JavaSE 5.0起这个循环可以采用更优雅的for each循环代替。编译器简单的把“for each”循环翻译为带有迭代器的循环,“for each”循环可以与任何实现了Iterable接口的对象一起工作。(Collection类扩展了Iterable,因此对于标准类库中的集合均可以使用“for each”循环。)
for (Integer element : list) {
   //do something with element
}
  • 注意:使用Iterator来遍历集合时,应使用Iterator的remove()方法来删除集合中的元素,使用集合的remove()方法可能会抛出ConncurrentModificationException异常。原因是Iterator 是工作在一个独立的线程中,并且拥有一个mutex锁。Iterator被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,按照fail-fast原则Iterator会马上抛出java.util.ConcurrentModificationException 异常。因此Iterator在工作的时候是不允许被迭代的对象被改变的。但可以使用Iterator本身的方法remove()来删除对象,Iterator.remove()方法会在删除当前迭代对象的同时维护索引的一致性。示例代码如下。
public void iteratorRemoveTest() {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(3);
        list.add(5);
        Iterator<Integer> it = list.iterator();
        Integer num;
        while (it.hasNext()) {
            num = it.next();
            if (5 == num) {
                it.remove();
//                list.remove(num); // error
                continue;
            }
            System.out.println(num);
        }
    }

猜你喜欢

转载自blog.csdn.net/ifwinds/article/details/73467880