【问题标题】:Why doesn’t java.util.Collection define next(), hasNext() directly?java.util.Collection 为什么不直接定义 next(), hasNext()?
【发布时间】:2011-04-07 02:38:41
【问题描述】:

如果 Collection 定义 hasNext() 而不是 iterator().hasNext(),我们可以更轻松地编写循环:

while(collection.hasNext()){…}

代替:

Iterator it= collection.iterator();
While(it.hasNext()){…}

当然,我知道循环 for(E e:collection) 存在的简单方法。

接口Iterator为什么存在?

【问题讨论】:

    标签: java collections iterator


    【解决方案1】:

    因为您可以同时为同一个Collection 对象拥有多个有效的Iterator 对象。

    这很有用。如果Collection 定义了nexthasNext 方法,则将排除这种方法。

    【讨论】:

    • 多个迭代器?你能举个例子吗?
    • Shengyuan Lu:正如 John Kugelman 在他的回答中指出的那样,使用线程可以实现多个迭代器。
    • 在某些情况下,您可能希望来自单个线程的多个Iterator。例如,任何需要后视的数据结构。
    【解决方案2】:

    这不是线程安全的。该集合只能维持一个“当前位置”,因此您无法在两个不同的线程中同时对其进行迭代。

    拥有迭代器允许多个同时迭代的线程不会踩到彼此的脚趾。

    【讨论】:

    • ...只要他们不修改他们指向的集合。在后一种情况下,将抛出 ConcurrentModificationException。
    【解决方案3】:

    我了解将迭代器从集合中剔除的基本原理是这样可以有许多种类(而不是简单地通过集合向前移动)。您可以创建自己的迭代器来倒退或执行类似遍历访问所有节点的 DOM 图的操作。

    【讨论】:

      【解决方案4】:

      主要原因是集合必须具有迭代“状态”。您不能同时支持多个迭代。 PHP 数组有类似内置迭代状态的东西,这让我很困惑。

      【讨论】:

        猜你喜欢
        • 2015-03-31
        • 2014-08-19
        • 2012-07-06
        • 1970-01-01
        • 2023-03-05
        • 2013-05-28
        • 2018-10-15
        • 2016-12-28
        相关资源
        最近更新 更多