【问题标题】:Do the List iterators support remove?List 迭代器是否支持删除?
【发布时间】:2020-11-21 08:22:08
【问题描述】:

remove 方法在Iterator 和 ListIterator 中是可选的。您从 JDK 列表中获得的 Iterators 或 ListIterators 是否实现了remove 操作?这在文档中没有说明。

【问题讨论】:

  • 标准库中的一些迭代器支持删除。有些没有。 (Java Iterator 接口在这方面可以说是被破坏了。)
  • @khelwood 我特别询问您从列表中获得的迭代器

标签: java list iterator


【解决方案1】:

其实,回答起来有点意思。 Java 在迭代器 背后有着悠久的历史。让我把历史告诉你,然后,事情为什么会这样,就很清楚了。

Iterators java 之前有 Enumeration 接口。提供的方法枚举有:

  1. 布尔 hasMoreElements()
  2. 对象 nextElement()

现在,Vector 等 Java 遗留类支持枚举。

但是,枚举在 Java 中被禁止,而 Java 开始以一种全新的方式编写其 Collection 框架,即使其 Collection 框架现代化.现在,在新的 Collections java 中使用了 Iterators。这些迭代器支持以下方法:

  1. boolean hasNext()
  2. E 下一个()
  3. 默认 void remove()
  4. default void forEachRemaining(Consumer super E> action)

我想我已经把自己说清楚了。

现在,想想 java 完全开始使用 Iterators,但仍然有很多遗留代码使用 Enumerations。那么,问题是随着 java 的更新,这些代码会发生什么?

因此,java 为您提供了一个机会,可以在默认情况下将 Iterators 而非 Enumerations 用于一些遗留类和那些遗留的那些 Iterators类只是 Enumeration 接口的包装。但是这些Iterators不支持remove()导致那些下划线的类Enumeration接口不支持remove(),这就是为什么。所以,当你在那些 Iterators 上调用 remove() 时,它会抛出 UnsupportedOperationException -> 这个异常。

我希望在这一切都清楚之前,你已经得到了你的答案。但让我允许多说一点。

那些已经使用枚举编写的遗留类呢?

您可以像 java 已经为自己解决的那样解决这个问题,只需在 Enumeration 接口上为您正在编写的新代码提供 Iterator 包装器。这样,您将在新的 Java 功能中编写新代码,而不必更改旧代码:D

【讨论】:

    【解决方案2】:

    总结:

    • ArrayList.iterator 支持 remove,即使它没有明确记录
    • LinkedList.iterator 支持 remove,即使它没有明确记录
    • CopyOnWriteArrayList.iterator支持remove
    • Collections.unmodifiableList 返回的列表支持remove

    标准类的经验法则似乎是:迭代器支持删除,除非有充分的理由不这样做。

    【讨论】:

      【解决方案3】:

      文档确实声明 Iterator 的默认实现不支持 removeList#iterator 是否支持 remove 取决于 List 的实现。例如,ArrayList 实现中定义的ListItr 支持删除。

      【讨论】:

        猜你喜欢
        • 2015-12-29
        • 2014-07-26
        • 2013-06-24
        • 2016-07-15
        • 1970-01-01
        • 2013-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多