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

迭代器的remove方法如何实际删除对象

施昊然
2023-03-14
问题内容

我们都知道,在迭代时从集合中删除对象的最安全的“可能也是唯一安全的”方法是,首先检索Iterator,执行循环并在需要时删除;

Iterator iter=Collection.iterator();
while(iter.hasNext()){
    Object o=iter.next()
    if(o.equals(what i'm looking for)){
        iter.remove();
    }
}

我想了解但不幸的是,还没有找到深入的技术解释,即如何执行此删除操作,
如果:

for(Object o:myCollection().getObjects()){
    if(o.equals(what i'm looking for)){
        myCollection.remove(o);
    }
}

会抛出ConcurrentModificationException“技术术语”
Iterator.remove()做什么?它是否会删除对象,中断循环并重新启动循环?

我在官方文档中看到:

“删除当前元素。IllegalStateException如果尝试调用remove()之前未调用next()的方法,则抛出该异常。

“删除当前元素”部分使我想到了在“常规”循环=>中执行的完全相同的情况(执行相等性测试并在需要时删除),但是为什么Iterator循环ConcurrentModification安全?


问题答案:

Iterator删除元素的确切方式取决于其实现,这对于不同的Collection可能有所不同。绝对不会中断您所处的循环。我只是看了如何实现ArrayList迭代器,下面是代码:

public void remove() {
    if (lastRet < 0)
        throw new IllegalStateException();
    checkForComodification();

    try {
        ArrayList.this.remove(lastRet);
        cursor = lastRet;
        lastRet = -1;
        expectedModCount = modCount;
    } catch (IndexOutOfBoundsException ex) {
        throw new ConcurrentModificationException();
    }
}

因此,它检查并发修改,使用公共ArrayList remove
方法删除元素,并递增列表修改的计数器,以便在下一次迭代时不会引发ConcurrentModificationException。



 类似资料:
  • 问题内容: 一段时间以来,我一直在努力解决此错误,而且我不知道问题出在哪里。我的代码是这样的: 它在remove调用上引发IllegalStateException。 我一直在想问题是否会出现,因为我要删除列表的最后一项,但即使在过程的中间,它似乎也会出错。 你们能给我一个解释吗? 问题答案: 您正在从内部循环内部的列表中删除一个元素。这意味着您的内部循环可能会尝试两次删除相同的元素,这将解释您遇

  • 现在,这段代码运行良好,该项从p对象和jlist中都被删除,但它在it.next()行抛出一个“ConcurrentModificationException”异常。 我怎么解决这个?

  • 问题内容: 我对迭代器的方法有疑问。如果我的代码包含以下内容(大小为4),请执行以下操作: 在第一次迭代时,迭代器开始指向索引为0的元素?还是喜欢“指数-1”? 我问,因为据我所知,该方法返回集合中的下一个元素。 因此,如果在第一次迭代时迭代器在被调用时从索引0开始,它将返回索引1的元素,而我将无法对索引0的元素做任何事情? 问题答案: 可以将其视为两步过程。首先,它获得迭代器中的下一个项目,然后

  • 本文向大家介绍jQuery删除节点用法示例(remove方法),包括了jQuery删除节点用法示例(remove方法)的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jQuery删除节点的方法。分享给大家供大家参考,具体如下: 效果图如下: 更多关于jQuery相关内容感兴趣的读者可查看本站专题:《jQuery常见事件用法与技巧总结》、《jQuery常用插件及用法总结》、《jQuery操作

  • 问题内容: 有没有一种方法来获取数组的迭代器?像这样: 问题答案: 您可以使用: 它只是将数组包装在列表实现中,以便您可以在其上调用方法。 请注意,这种方法仅适用于对象数组。对于原始数组,您将必须实现自己的迭代器(例如,使用匿名类)。 从Java 8开始,您还可以使用开箱即用的迭代器(并且如果是或,也可以使此代码进行编译: 尽管您将无法使用原始数据类型,并且因为没有相应的流实现。但是,您可以使用以

  • 本章将讨论removeClass()方法,它是用于管理jQueryUI视觉效果的方法之一。 removeClass()方法从元素中删除应用的类。 removeClass()方法在为所有样式更改设置动画时将指定的类移除到匹配的元素。 语法 (Syntax) 在jQueryUI的1.0版中添加 removeClass()方法的基本语法如下 - .removeClass( className [, du