java – Collections remove方法不给出Concurrent Modification
我已经阅读了一篇关于从
this link中删除集合中的元素的文章
根据我的理解迭代器删除方法防止并发修改异常然后删除Collection.But的方法当我尝试运行下面的codde我无法得到concurrentmoficationexception List dayList= new ArrayList(); dayList.add("Sunday"); dayList.add("Monday"); dayList.add("Tuesday"); dayList.add("Wednesday"); dayList.remove("Tuesday"); Iterator itr=dayList.iterator(); while(itr.hasNext()) { Object testList=itr.next(); if(testList.equals("Monday")) { dayList.remove(testList); } } System.out.println(dayList); } >根据javadoc,当我们尝试在iteartion期间进行任何修改时抛出ConcurrentModicationException.我正在使用集合remove方法,但仍然没有异常.但是如果我注释行dayList.remove(“Tuesday”);,则抛出异常. 任何人都可以解释这段代码中幕后发生的事情吗? 解决方法
如果我评论行dayList.remove(“星期二”);,抛出异常….
其实这不是问题.问题是仅针对中间值发生异常. ‘for each’循环的工作原理如下, 1.It gets the iterator. 2.Checks for hasNext(). public boolean hasNext() { return cursor != size(); // cursor is zero initially. } 3.If true,gets the next element using next(). public E next() { checkForComodification(); try { E next = get(cursor); lastRet = cursor++; return next; } catch (IndexOutOfBoundsException e) { checkForComodification(); throw new NoSuchElementException(); } } final void checkForComodification() { // Initially modCount = expectedModCount (our case 5) if (modCount != expectedModCount) throw new ConcurrentModificationException(); } 重复步骤2和3,直到hasNext()返回false. 如果我们从列表中删除一个元素,它的大小会减少并且modCount会增加. 如果我们在迭代时删除一个元素,则modCount!= expectedModCount得到满足并抛出ConcurrentModificationException. 但删除倒数第二个对象很奇怪.让我们看看它在你的情况下是如何工作的. 原来, cursor = 0 size = 5 --> hasNext() succeeds and next() also succeeds without exception. cursor = 1 size = 5 --> hasNext() succeeds and next() also succeeds without exception. cursor = 2 size = 5 --> hasNext() succeeds and next() also succeeds without exception. cursor = 3 size = 5 --> hasNext() succeeds and next() also succeeds without exception. 在您删除“d”的情况下,大小会减少到4. cursor = 4 size = 4 --> hasNext() does not succeed and next() is skipped. 在其他情况下,将抛出ConcurrentModificationException 在这种情况下,不会进行此检查. 如果在迭代时尝试打印元素,则只打印四个条目.跳过最后一个元素. 您的问题类似于this问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |