当你在arraylist上调用remove(object o)时,它如何比较对象?

当你在java中的arraylist上调用remove(object o)时,它如何比较对象以找到要删除的正确对象? 它是否使用指针? 还是使用Comparable接口比较对象?

ArrayList remove()依赖于Equal方法的对象实现。 如果没有执行任何实现,则Object实现Equals删除Object ,这实际上是指针比较。

ArrayList的文档 –

更正式地,删除具有最低索引i的元素,使得(o==null ? get(i)==null : o.equals(get(i))) (如果存在这样的元素)

对象equal方法文档 –

类Object的equals方法实现了对象上最具辨别力的等价关系; 也就是说,对于任何非空引用值xy ,当且仅当xy引用同一对象时,此方法才返回true( x == y的值为true )。

您应该始终查阅API以获取此类信息。

ArrayList.remove(Object o) :从此列表中删除指定元素的第一个匹配项(如果存在)。 如果列表不包含该元素,则不会更改。 更正式地,删除具有最低索引i的元素,使得(o==null ? get(i)==null : o.equals(get(i))) (如果存在这样的元素)。

也许你把它与例如TreeSet混淆了:

java.util.TreeSet :注意,如果要正确实现Set接口,则由set维护的排序(无论是否提供显式比较器)必须与equals一致 。 (请参阅Comparable或Comparator以获得与equals一致的精确定义。)这是因为Set接口是根据equals操作定义的,但TreeSet实例使用compareTo (或compare )方法执行所有元素比较,因此从该集合的角度来看,通过这种方法被认为相等的元素是相等的。

(不幸的是,例如TreeSet.remove方法本身没有任何明确提醒上面的警告,但至少它突出位于类文档的顶部)


一个说明性的例子

以下代码段说明了使用equals集合(例如ArrayList )和使用compare/compareTo集合(例如TreeSet )之间的行为差​​异。

 import java.util.*; public class CollectionEqualsCompareTo { static void test(Collection col, Object o) { col.clear(); col.add(o); System.out.printf("%b %b %b %b%n", col.contains(o), col.remove(o), col.contains(o), col.isEmpty() ); } public static void main(String[] args) { Object broken1 = new Comparable() { // Contract violations!!! Only used for illustration! @Override public boolean equals(Object o) { return true; } @Override public int compareTo(Object other) { return -1; } }; Object broken2 = new Comparable() { // Contract violations!!! Only used for illustration! @Override public boolean equals(Object o) { return false; } @Override public int compareTo(Object other) { return 0; } }; test(new ArrayList(), broken1); // true true false true test(new TreeSet(), broken1); // false false false false test(new ArrayList(), broken2); // false false false false test(new TreeSet(), broken2); // true true false true } } 

文档回答了你的问题:

从此集合中移除指定元素的单个实例(如果存在)(可选操作)。 更正式地,如果集合包含一个或多个这样的元素,则删除元素e (o==null ? e==null : o.equals(e))

它使用equals()

来自文档 :

从该列表中删除指定元素的第一个匹配项(如果存在)。 如果列表不包含该元素,则不会更改。 更正式地,删除具有最低索引i的元素,使得(o == null?get(i)== null:o.equals(get(i)))(如果存在这样的元素)。 如果此列表包含指定的元素,则返回true(或等效地,如果此列表因调用而更改)。