我只是好奇单个对象上的多个迭代器会如何表现并输入以下代码。
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));
}
}
map 如预期的那样是空的但是,我认为Iterator#hasNext
会返回 false
,但它会返回 true
和 Iterator#next
抛出一个 ConcurrentModificationException
。
当使用 Iterator#remove
方法从 Collection
中删除一个值时,另一个迭代器的 hasNext
方法不应该返回 false,因为不会有任何返回值吗?
最佳答案
hasNext
方法只检查 next
属性:
public final boolean hasNext() {
return next != null;
}
唯一修改next
属性的方法是:
也就是说,如果你有几个Iterator
实例指向同一个集合实例,只有当你调用上面两种方法之一时,Iterator才会访问底层集合并检查它的状态是否发生了变化。
请注意,如果基础集合被修改,则迭代器的行为是未指定,这意味着它可能会发生变化,您不应依赖它。
关于java - 迭代器 hasNext 返回 true 但 next 抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26379707/