如果你在同一个集合上调用同一个迭代器两次会发生啥?

Posted

技术标签:

【中文标题】如果你在同一个集合上调用同一个迭代器两次会发生啥?【英文标题】:What happens if you call the same iterator twice on the same collection?如果你在同一个集合上调用同一个迭代器两次会发生什么? 【发布时间】:2011-04-19 09:27:52 【问题描述】:

如果我为 myList 设置一个迭代器:

Iterator iter = myList.iterator();
while(iter.hasNext())

    MyObj myObj = (MyObj)iter.next();
    doPrint(myObj.toString());

我又叫它第二次了:

while(iter.hasNext())

    MyObj myObj = (MyObj)iter.next();
    doPrint(myObj.toString());

我第二次调用它时它会回到集合的开头吗?

【问题讨论】:

为什么不自己试试呢? java.util.ConcurrentModificationException 【参考方案1】:

第二个循环中的iter.hasNext()会立即返回false,所以循环内的代码不会被执行。

但是,如果您重新创建迭代器(通过list.iterator()),迭代将从头开始。

【讨论】:

+1 以明确第二次调用 .iterator() 的结果。【参考方案2】:

第二部分不会执行,因为iter.hasNext()返回false...

【讨论】:

【参考方案3】:

迭代器接口只提供了三个方法:

hasNext() 下一个() 删除()

所以没有办法告诉迭代器“重置”、“从头开始”或“返回”。一旦它位于底层序列的最后一个元素上,它就完成了它的工作,不需要保留引用。耳语 R.I.P 并让它遇见 Big GC。

【讨论】:

以上是关于如果你在同一个集合上调用同一个迭代器两次会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中,包含一个有命名空间的文件两次会发生错误

如果同时触发两次 Azure 数据工厂会发生啥?

当我在严格的客户端集合上调用更新/插入时会发生啥?

Nuxt apollo 智能查询被调用了两次。引擎盖下会发生啥?

Swinject - 如何从一个解析器两次解析同一个控制器?

Laravel 访问器两次向 json 对象提供信息