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

时间:2010-05-24 03:40:25

标签: java arraylist compare

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

4 个答案:

答案 0 :(得分:16)

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

来自Equals -

的文档
  

更正式地,删除具有最低索引i的元素,使ArrayList(如果存在这样的元素)

对象(o==null ? get(i)==null : o.equals(get(i)))方法文档 -

  

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

答案 1 :(得分:8)

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

  

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

也许你对此感到困惑,例如TreeSet

  

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

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


一个说明性的例子

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

TreeSet

答案 2 :(得分:1)

docs回答你的问题:

  

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

答案 3 :(得分:1)

它使用equals()

来自docs

  

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