英文:
Do the List iterators support remove?
问题
删除方法在Iterator和ListIterator中是可选的。您从JDK列表中获取的迭代器或列表迭代器是否实现了remove操作?文档中没有说明。
英文:
The remove method is optional in Iterator and ListIterator. Do the Iterators or ListIterators you get from the JDK lists implement the remove
operation? This is not stated in the documentation.
答案1
得分: 3
总结:
- ArrayList.iterator 支持
remove
,尽管没有明确记录 - LinkedList.iterator 支持
remove
,尽管没有明确记录 - CopyOnWriteArrayList.iterator 不 支持
remove
- 由
Collections.unmodifiableList
返回的 List 不 支持remove
标准类的经验法则似乎是:除非有充分理由不支持,否则迭代器支持删除。
英文:
In summary:
- ArrayList.iterator supports
remove
even though it's not explicitly documented - LinkedList.iterator supports
remove
even though it's not explicitly documented - CopyOnWriteArrayList.iterator does not support
remove
- List returned by
Collections.unmodifiableList
does not supportremove
The rule of thumb for the standard classes seems to be: iterators support removal unless there's a good reason not to.
答案2
得分: 2
事实上,回答起来很有趣。Java在**迭代器(Iterators)**方面有着一段历史。让我来告诉你这段历史,然后你就会明白为什么事情会变成这样。
在迭代器之前,Java有**枚举(Enumeration)**接口。枚举提供了以下方法:
- boolean hasMoreElements()
- Object nextElement()
如今,Java的旧类(例如Vector)支持枚举。
但随后,在Java开始以全新的方式编写其集合(Collection)框架——即为了使其集合框架现代化——枚举在Java中被淘汰了。现在,在新的集合(Collections)中,Java使用了迭代器。这些迭代器支持以下方法:
- boolean hasNext()
- E next()
- default void remove()
- default void forEachRemaining(Consumer<? super E> action)
我想我已经表达得很清楚了。
现在,考虑Java完全开始使用迭代器,但仍然存在大量使用枚举的遗留代码。那么问题来了,随着Java的更新,这些代码会发生什么变化呢?
因此,Java为你提供了一个机会,可以在一些遗留类上默认使用迭代器而不是枚举,而这些遗留类的迭代器只是枚举接口的包装器。但这些迭代器不支持remove(),因为这些类底层的枚举接口不支持remove()。所以,当你在这些迭代器上调用remove()时,会抛出UnsupportedOperationException异常。
我希望到这一点,一切都清楚了,你也得到了你的答案。但是让我再多说一点。
那些已经使用枚举编写的遗留类怎么办呢?
你可以像Java自己做的那样解决这个问题,只需为你正在编写的新代码提供迭代器包装器,覆盖枚举接口。通过这种方式,你将在新的Java特性中编写新代码,而无需更改旧代码
英文:
Actually, it's kind of interesting to answer. Java has a history behind Iterators. Let me tell you the history, Then, it'll be clear why things are like this.
Before Iterators java has Enumeration Interface. The methods Enumeration provided are:
- boolean hasMoreElements()
- Object nextElement()
Now, java legacy classes like Vector supports Enumeration.
But then, Enumeration got banned in Java while Java started writing its Collection framework in a totally new way i.e. to modernize its Collection framework. Now, in the new Collections java used Iterators. These iterators support the following mehtods:
- boolean hasNext()
- E next()
- default void remove()
- default void forEachRemaining(Consumer<? super E> action)
I think I've made myself clear to this point.
Now, think about java totally started using Iterators, but there is still a lot of legacy code out there with Enumerations. So, the question is what will happen with those code, as java got updated?
So, java has provided you with a opportunity to use Iterators over Enumerations by default with some legacy classes and those Iterators of those legacy classes are just a wrapper around Enumeration Interface. But these Iterators does not support remove() cause those classes underline Enumeration Interface does not support remove(), that's why. So, when you call remove() on those Iterators, it throws UnsupportedOperationException -> this exception.
I hope till this everything is clear and you've got ur answer. But let me allow to say a little more.
What about those legacy classes those already have been written using Enumerations?
You can solve this problem as java has already done for itself, just provide Iterator wrapper over the Enumeration Interface for new codes you are writing. In this way, you will be writing new codes in new java features and you don't have to change the old code too
答案3
得分: 1
文档确实说明了Iterator的默认实现不支持remove操作1。关于List#iterator
是否支持remove操作取决于List的实现。例如,ArrayList
实现中定义的ListItr
支持remove操作。
英文:
The documentation does state that the default implementation of Iterator does not support remove. Whether or not the List#iterator
supports remove
depends on the List implementation. For example, ListItr
defined in the ArrayList
implementation supports remove.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论