集合框架-Iterator

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

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

这里写图片描述

迭代器的设计思想是不暴露具体如何遍历集合,而提供一个相同的访问方法去遍历,专业点的描述:迭代器是一个对象,它的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构。此外,迭代器通常被称为轻量级对象,创建它的代价小,因此会有一些限制,如Iterator只能单向移动。

二、Iterator方法介绍

  1. boolean hasNext() 检查是否有下一个元素,如果存在则返回true。
  2. E next() 取下一个元素,如果已经到达集合的尾部,将抛出一个NoSuchElementException,因此需要在调用next()之前调用hasNext()。
  3. void remove() 将迭代器新近返回的元素删除,这个方法必须紧跟在访问一个元素之后执行。如果上次访问之后,集合已经发生了变化,这个方法将抛出一个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);
        }
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值