当你在java中的arraylist上调用remove(object o)时,如何比较对象以找到要删除的正确对象?它是否使用指针?还是使用Comparable接口比较对象?
答案 0 :(得分:16)
ArrayList
remove()
依赖于Equal
方法的对象实现。如果没有执行任何实现,则Object
的{{1}}实现删除了对象,这实际上是指针比较。
来自Equals
-
更正式地,删除具有最低索引i的元素,使
ArrayList
(如果存在这样的元素)
对象(o==null ? get(i)==null : o.equals(get(i)))
方法文档 -
类Object的equals方法实现了对象上最具辨别力的等价关系;也就是说,对于任何非空引用值
equal
和x
,当且仅当y
和x
引用同一对象时,此方法才返回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(或等效地,如果此列表因调用而更改)。