当前位置: 首页 > 面试题库 >

魔数ConcurrentModificationException

阙辰龙
2023-03-14
问题内容

我正在ConcurrentModificationException使用以下代码测试集合:

public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<String>();
    list.add("a");
    list.add("b");
    list.add("c");

    for (String s : list) {
     // if (s.equals("a")) { // ConcurrentModificationException!
        if (s.equals("b")) { // -->> Magic number, NO Exception, Why? 
     // if (s.equals("c")) { // ConcurrentModificationException!
            list.remove(s);
        }
    }
    System.out.println(list);
}

我不明白为什么删除“ b”可以,但是其他NG?


问题答案:

首先要知道的是(如JLS所述)以下增强的for循环:

    for (String s : list) {
        // Do something with s
    }

等效于:

    for (Iterator<String> it = list.iterator(); it.hasNext();) {
        String s = it.next();
        // Do something with s
    }

如果查看中的迭代器的实现AbstractList,您将看到:

  • hasNext() 不检查并发修改,仅使用大小检查我们是否在列表的末尾:
        public boolean hasNext() {
            return cursor != size();
    }
  • 首先要做的next()是调用checkForComodification()以查看在迭代过程中列表是否被修改:
        public E next() {
            checkForComodification();
        try {
        E next = get(cursor);
        lastRet = cursor++;
        return next;
        } catch (IndexOutOfBoundsException e) {
        checkForComodification();
        throw new NoSuchElementException();
        }
    }

    final void checkForComodification() {
        if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
    }

因此,当您迭代并删除列表的倒数第二个元素时,下一条指令将是对的调用hasNext(),该调用将返回false,因为删除一个元素会导致列表的大小减小一倍,并且您的迭代将停止而无需调用next()并抛出一个Exception

顺便说一下,所有这些都只是实现细节,您不应该依赖它,因为它可以更改,并且it.remove()在迭代时可以从列表中删除元素。



 类似资料:
  • 实际上MATLAB提供了一个函数可以计算出任意规格的魔方矩阵,毫不奇怪,这个函数就是magic. B = magic(4) B = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 与刻在杜勒的木板上的那个矩阵差不多一样,具有相同的性质。

  • 在 Python 中,定义函数和调用函数都很简单,但如何定义函数参数和传递函数参数,则涉及到一些套路了。总的来说,Python 的函数参数主要分为以下几种: 必选参数 默认参数 可变参数 关键字参数 必选参数 必选参数可以说是最常见的了,顾名思义,必选参数就是在调用函数的时候要传入数量一致的参数,比如: >>> def add(x, y): # x, y 是必选参数 ...

  • 介绍 魔方+是魔方加密为高级开发者提供的增值服务。 魔方+主要适合于: 企业开发者 需要经常进行加密的开发者 Discuz! 模板开发者 希望使用经过长时间线上考验的 Panda · 第一代加密引擎的开发者 希望使用文件认证模板功能的开发者 其它希望购买魔方+的开发者 购买魔方+后,在服务期限内: 加密文件不收取费用 可以加密 Discuz! 模板 可以选用 Panda 和 Crane 两套加密引

  • 我想编程一个魔术广场,其中数组的利用率是在地方,但当我想运行它,它显示我该怎么办?它会显示 我还应该从这个程序中添加或删除什么?

  • 4.1 重新认识函数 我们先不谈 Python 中的函数定义,因为将定义放在章节的首要位置,这明显就是懒得把事情讲明白的做法,相信你在阅读其他教材时对这点也深有体会。而我要说的是,经过第一章的阅读与训练,其实你早已掌握了函数的用法: 通过观察规律其实不难发现,Python 中所谓的使用函数,就是把你要处理的对象放到一个名字后面的括号里。简单来说,函数就是这么使用的,往里面塞东西就可以得到处理结果。

  • 我们既蒙怜悯,受了这职分,就不丧胆,乃将那些暗昧可耻的事弃绝了,不行诡诈,不谬讲神的道理,只将真理表明出来,好在神面前把自己荐与各人的良心。(2 CORINTHIANS 4:1-2) 黑魔法 围绕类的话题,真实说也说不完,仅特殊方法,除了前面遇到过的__init__(),__new__(),__str__()等之外,还有很多。虽然它们仅仅是在某些特殊情景中使用,但是,因为本教程是“From Beg