迭代器(Iterator)

Iterator(迭代器,接口)

iterator是一个接口,我们无法创建它,集合里面都实现了iterator接口,内部类

    private class Itr implements Iterator<E> { }

并提供了public获取对象的方法

   public Iterator<E> iterator() { return new Itr(); }

获取方法:

   Iterator it = 集合对象.iterator();

成员方法:

    boolean hasNext() 是否有下一个

    E next() 获取下一个元素

 

并发修改异常(ConcurrentModificationException)产生原因:

用迭代器遍历时,使用集合中的方法修改了集合的长度

源码解析:

   在next()方法中有一个计数器,每次调用该方法时,都会比较一下看看有没有被修改,如果修改了则报错。

public E next() {

   checkForComodification();

   int i = cursor;

   if (i >= size)

       throw new NoSuchElementException();

   Object[] elementData = ArrayList.this.elementData;

   if (i >= elementData.length)

       throw new ConcurrentModificationException();

   cursor = i + 1;

   return (E) elementData[lastRet = i];

}

final void checkForComodification() {

    if (modCount != expectedModCount)

         throw new ConcurrentModificationException();

}

解决方案:

1.在迭代的过程中,不对集合的长度进行修改

2.使用Iterator提供的方法来操作集合。

扩展:

Iterator接口有一个子接口ListIterator接口(只有List接口下边的集合可以使用)

ListIterator接口中定义了add方法和remove方法,可以对集合添加/删除元素

如果使用ListIterator接口中的add/remove方法对集合添加/删除元素,那么迭代器自己添加/删除的,就不会抛出异常了

 

使用:

ArrayList<String> array = new ArrayList<String>();

array.add("zhangs");

array.add("lisi");

array.add("zhaol");

Iterator<String> it = array.iterator();

while(it.hasNext()){

    String str = it.next();

    System.out.println(str);

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值