工作踩得坑之二遍历链表时删除元素

原创 2016年05月30日 21:20:26

先描述一下需求:在一个链表中删除满足条件的元素。
我当时是类似这么写的哈:
public static void main(String[] args){
List list = new ArrayList();

        list.add(3);
       Iterator<Integer> itertor = list.iterator();
        while( itertor.hasNext()){
            Integer element = itertor.next();
             if( element.equals(2)){
                  list.remove( element);
            }
       }
 }

结果:抛出ConcurrentModificationException异常。
从逻辑上来讲,这是符合的,可是怎么会抛出一个异常来。于是跟进源码:

  • 追踪源代码:list.iterator();

    public Iterator iterator() {
    return new Itr();
    }
    可见返回了一个指向Itr类型对象的引用。
    private class Itr implements Iterator {
    int cursor; // index of next element to return
    int lastRet = -1; // index of last element returned; -1 if no such
    int expectedModCount = modCount
    }

  • 执行while( itertor.hasNext())。

  • public boolean hasNext() {
    return cursor != size;
    }
    我们来看看cursor表示下一个元素索引。

    - 执行Integer element = itertor.next();

    @SuppressWarnings("unchecked")
    public E next() {
        //判断修改次数是否和期望的修改次数一致。不相等,则会抛出 throw new                                   ConcurrentModificationException();
        checkForComodification();
        int i = cursor;
        if ( i >= size)
            throw new NoSuchElementException();
        Object[] elementData = ArrayList. this. elementData;
        if ( i >= elementData. length)
            throw new ConcurrentModificationException();
        //此时cursor=1,指向下一个元素
        cursor = i + 1;
        //取出下一个元素,并且lastRet的值为0
        return (E) elementData[ lastRet = i];
    }
    
版权声明:本文为博主原创文章,未经博主允许不得转载。

工作踩得坑之四简单的日志记录

最近接手了一个项目,需要大量的数据采集以及相应的业务运算,所以就采用了kettle来抽取业务所需要的基本数据,然后crontable做得定时任务。但是这个项目中有一些业务如果稍微改动,会严重影响抽取数...
  • abysstoabyss
  • abysstoabyss
  • 2016年07月11日 21:08
  • 159

单链表的各种操作——创建及遍历

链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。...
  • i_am_what_i_am
  • i_am_what_i_am
  • 2016年05月13日 23:30
  • 4872

双向链表的有关操作(创建,遍历,插入,删除)

#include #include #include using namespace std; typedef struct node {     int ans;     struct nod...
  • AC_Gibson
  • AC_Gibson
  • 2014年11月04日 19:34
  • 902

链表《1》链表的创建和遍历

链表是一种动态数据结构,它的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素,一个简单的链表如下图所示 尾结点 链表中每一个元素称为结点,每一个结点都是由数据域和指针域...
  • u010105970
  • u010105970
  • 2014年04月23日 10:21
  • 1566

倒序遍历链表

倒序输出单链表
  • liu16659
  • liu16659
  • 2017年04月16日 20:46
  • 458

循环链表(3) - 遍历

在循环链表系列的前2篇文章中,已经介绍了循环链表的基本情况以及插入操作。本篇讨论如何对它进行遍历操作。 通常对普通链表进行遍历时,一般从头节点开始,并遇到null节点时停止。而在循环链表中,当第二次...
  • shltsh
  • shltsh
  • 2015年06月15日 01:12
  • 1312

重新认识链表(单向链表并遍历)

接触了数据结构 发现无非就是 数据的存储问题和解决办法 那么就是  线性和非线性 最基础的就是  线性表(数组和链表)   不得不又重新 拾起 C语言,也是我比较头痛的 指针问题。 C语言实训的时候...
  • sinat_25926481
  • sinat_25926481
  • 2015年08月31日 19:56
  • 1216

有向图遍历,十字链表存储,深度遍历,广度遍历。

有向图遍历,十字链表存储,深度遍历,广度遍历。
  • zhu_xiao_yuan
  • zhu_xiao_yuan
  • 2015年12月31日 18:50
  • 789

javascript数组遍历for in的一些坑

js中数组遍历的时候,常见的的是for循环,简单易懂for (var index = 0; index < myArray.length; index++) { console.log(myArra...
  • juzipchy
  • juzipchy
  • 2017年04月20日 20:38
  • 363

c++ 链表操作:添加、遍历、删除、查找

链表是一种动态数据结构,因为在创建链表的时候,无需知道链表的长度。链表的每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 struct node { int ...
  • yes1cpp
  • yes1cpp
  • 2014年02月09日 17:32
  • 5188
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:工作踩得坑之二遍历链表时删除元素
举报原因:
原因补充:

(最多只允许输入30个字)