Java Iterator正在跳过元素

时间:2019-01-06 06:09:49

标签: java debugging intellij-idea iterator

在通过Iterator进行调试时,我注意到一个奇怪的行为;该Iterator跳过了一些元素。一段时间后,我意识到 调试手表正在更改我的运行时变量值。

然后我得到

Caused by: java.util.NoSuchElementException: null
at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:721) ~[na:1.8.0_181]
at java.util.LinkedHashMap$LinkedKeyIterator.next(LinkedHashMap.java:742) ~[na:1.8.0_181]

enter image description here  2.

1 个答案:

答案 0 :(得分:0)

与调试监视程序无关。

这可能会有所帮助:来自LinkedHashMap

  

在访问顺序链接的哈希表中,仅使用get查询该表是结构上的修改

假设您通过了true时,linkhashmap构造函数的有序访问会导致每次get操作的结构更改。

您的时间

while(planetsIterator.hasNext() && ...) {
   Planet planet = planetsIterator.next();
   ...
}

被编译为

Iterator<Planet> it = planetsIterator.keySet().iterator();
while (it.hasNext()) {
    String key = it.next();
    Planet planet = planetsIterator.get(key);
    ...
}

因此,get运算符引起结构更改。

您可以使用EntrySet来避免这种情况。

请注意,此实现未同步。因此,它不是线程安全的。