在Java中从ArrayList中删除元素/对象的2种方法[实例]

317 阅读3分钟

在Java中,有两种方法可以从ArrayList中移除对象,第一种是使用remove()方法,第二种是使用Iterator。ArrayList提供了重载的remove()方法,一个是接受要删除的对象的索引,即remove(int index),另一个是接受要删除的对象,即remove(Object obj)。经验法则是,如果你知道对象的索引,那么使用第一个接受索引的方法,否则使用第二个方法。顺便说一下,你必须记住使用ArrayList的移除方法,只有当你ArrayList上迭代时,如果你在迭代,那么使用Iterator.remove()方法,不这样做可能会导致Java的ConcurrentModificationException 。

另一个问题可能是由于自动勾选而产生的。如果你仔细观察,如果你试图从一个整数的ArrayList中移除对象,这两个移除方法,remove(int index)和remove(Object obj)是没有区别的。

假设你在ArrayList中有三个对象,即 [1,2,3],你想删除第二个对象,也就是2。你可以调用remove(2),如果考虑到autoboxing,这实际上是对 remove(Object)的调用,但会被解释为对删除第三个元素的调用,被理解为remove(index)。

我在之前的文章中讨论过这个问题,关于在Java中重载方法时需要遵循的最佳实践。由于鲜为人知的拓宽规则和自动勾选,糟糕的重载方法会造成很多歧义。

在Java中从ArrayList中移除元素的代码示例

让我们用一个带有整数的ArrayList 的简单代码例子来测试上述理论。下面的程序有一个包含1、2、3即[1、2、3]的Integer的ArrayList,它正好对应于索引。

package

你可以看到,第二个调用也被当作remove(index)处理。消除歧义的最好方法是去掉自动框,提供一个实际的对象,如下所示。

System.

这一次,它起作用了,但我害怕像我这样懒惰的开发者,他们认为自动排版是理所当然的。现在让我们来看看在迭代ArrayList的同时,如何从ArrayList中移除对象。在进行下一步之前,你必须熟悉Java中的Iterator

使用Iterator从ArrayList中删除对象

2 example to remove Elements/objects from ArrayList in Java这实际上是Java编程的一个微妙的细节,对于初学者来说并不明显,因为即使你在使用Iterator时使用java.util.ArrayList的remove()方法,编译器也不会抱怨。

只有当你看到ConcurrentModificationException时,你才会意识到你的错误,这本身就是一种误导,你可能会花无数的时间去寻找另一个线程,它正在修改ArrayList,因为Concurrent字。让我们看一个例子。

public

你可以因为调用 ArrayList的remove()方法而产生ConcurrentModificationException。在这样的简单例子中,这很容易,但在真正的项目中,这可能是非常困难的。现在,要解决这个异常,只需将对numbers.remove()的调用替换为itr.remove(),这将删除你正在迭代的当前对象,如下所示。

System.

关于如何在Java中从ArrayList中移除对象的这篇文章就到此为止。我们已经学会了两种从ArrayList中删除对象或元素的方法。顺便说一下,如果你不在迭代,你应该总是使用remove(index) 来删除对象,否则,总是使用Iterator的remove()方法来删除ArrayList中的对象。

顺便说一下,上述提示对任何基于索引的List实现都有效。