Iterator remove与ArrayList之间的区别删除?

时间:2014-07-30 12:00:03

标签: java iterator

要从ArrayList中删除元素,我们可以使用 -

  1. 迭代时使用迭代器remove()。
  2. 对于ArrrayList remove(),不需要迭代。
  3. 在这些情况下,语法不同。所以

    • 两者都在内部使用相同的逻辑吗?
    • 与逻辑有什么不同吗?
    • 哪一个更好?

    非常感谢任何详细的解释/链接。

2 个答案:

答案 0 :(得分:2)

如果以与迭代器自己的ConcurrentModificationException方法不同的方式从底层集合中删除元素,则迭代器可能会抛出remove()

因此,如果您需要在迭代集合时删除元素,则允许您使用Iterator.remove()执行该操作,但您无法使用Collection.remove()执行此操作,而无需获取例外。

答案 1 :(得分:0)

remove是一个应该被Iterable所有对象实现的方法(如果不是,它应该抛出UnsupportedOperationException)(实现接口Itarable)。它的工作方式总是取决于实现它的对象。

这意味着ArrayList可以以完全不同的方式实现它,即LinkedList。

在Iterator中删除对象需要您迭代(找到)要删除的对象。

在ArrayList中使用remove方法(我在Javadoc中看不到删除:http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html)找到你的对象并删除它。它实际上会移动基础数组中的对象以填充您通过删除对象创建的“间隙”,因此如果您想要经常删除列表中的项目,则可以使用LinkedList。

此外,当您迭代列表时,如果您想以其他方式修改集合,则会导致异常,而不是通过迭代器方法。

您的问题的确切答案是: 1.他们没有使用不同的逻辑,而且Iterator甚至可能不允许删除对象(UnsupportedOperationException) 2.您在迭代时无法通过ArrayList删除对象,并且通过使用迭代器删除ArrayList中位置4处的对象您必须“手动”迭代4次。 3.取决于您是否已经知道要删除的对象,或者首先在迭代过程中检查所有对象并决定是否删除。另外 - 如果您想经常删除对象,最好使用LinkedList,而不是ArrayList。