我很好奇单个对象上的多个迭代器在下面的代码中的行为和类型。
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
,而是返回true
而Iterator#next
投了ConcurrentModificationException
。< / p>
当使用Collection
方法从Iterator#remove
中删除值时,其他迭代器的hasNext
方法不会返回false,因为不会返回任何值吗?
答案 0 :(得分:2)
hasNext
方法仅检查next
属性:
public final boolean hasNext() {
return next != null;
}
并且修改next
属性的唯一方法是:
这意味着,如果只有当您调用上述两种方法之一时,几个Iterator
实例指向同一个集合实例,Iterator将访问底层集合并检查其状态是否发生了变化。
请注意,如果底层集合被修改,迭代器的行为是未指定,这意味着它可能会被更改,您不应该依赖它。
答案 1 :(得分:1)
iterator.remove()
州的javadoc:
如果在迭代进行过程中以除了调用此方法之外的任何方式修改基础集合,则未指定迭代器的行为。
这正是代码中发生的事情,底层集合正在为多个迭代器进行修改。