java - 迭代器 hasNext 返回 true 但 next 抛出异常

标签 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));
  }
}

map 如预期的那样是空的但是,我认为Iterator#hasNext会返回 false,但它会返回 trueIterator#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/

相关文章:

java - 为什么 compareTo 在 Java 中的 Enum final 上?

java - 我如何将 Spring Security 与具有 session 复制功能的集群一起使用以对经过身份验证的用户进行故障转移?

Laravel:如何对忽略语言文章的 Eloquent 集合进行排序?

C++开始和结束不工作

javascript - 如何提取 json 对象数组中的深层和浅层嵌套字段

java - android库,使用android jar

java - Elasticsearch 中的 JSON 后编码

java - 任何人都可以向我解释这个 Java 问题吗?

vb.net - 不使用 Linq 对通用集合进行分页

c++ - 这是操纵 C++ 容器元素的正确方法吗?