iterator hasNext返回true但下一次抛出异常

时间:2014-10-15 10:01:25

标签: java collections iterator hashmap set

我很好奇单个对象上的多个迭代器在下面的代码中的行为和类型。

import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;

class Test{
  public static void main(String[] a) {
    Map<Integer,String> map = new HashMap<>();
    map.put(1,"One");

    Iterator<Integer> it1 = map.keySet().iterator();
    Iterator<Integer> it2 = map.keySet().iterator();

    it1.next();
    it1.remove();
    System.out.println(it2.hasNext());
    System.out.println(it2.next());

    System.out.println(map.get(1));
  }
}

地图按预期为空但是,我认为Iterator#hasNext会返回false,而是返回trueIterator#next投了ConcurrentModificationException。< / p>

当使用Collection方法从Iterator#remove中删除值时,其他迭代器的hasNext方法不会返回false,因为不会返回任何值吗?

2 个答案:

答案 0 :(得分:2)

hasNext方法仅检查next属性:

public final boolean hasNext() {
  return next != null;
}

并且修改next属性的唯一方法是:

这意味着,如果只有当您调用上述两种方法之一时,几个Iterator实例指向同一个集合实例,Iterator将访问底层集合并检查其状态是否发生了变化。

请注意,如果底层集合被修改,迭代器的行为是未指定,这意味着它可能会被更改,您不应该依赖它。

答案 1 :(得分:1)

iterator.remove()州的javadoc

  

如果在迭代进行过程中以除了调用此方法之外的任何方式修改基础集合,则未指定迭代器的行为。

这正是代码中发生的事情,底层集合正在为多个迭代器进行修改。