当你在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方法实现了对象上最具辨别力的等价关系; 也就是说,对于任何非空引用值
x
和y
,当且仅当x
和y
引用同一对象时,此方法才返回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
文档回答了你的问题:
从此集合中移除指定元素的单个实例(如果存在)(可选操作)。 更正式地,如果集合包含一个或多个这样的元素,则删除元素
e
(o==null ? e==null : o.equals(e))
。
它使用equals()
来自文档 :
从该列表中删除指定元素的第一个匹配项(如果存在)。 如果列表不包含该元素,则不会更改。 更正式地,删除具有最低索引i的元素,使得(o == null?get(i)== null:o.equals(get(i)))(如果存在这样的元素)。 如果此列表包含指定的元素,则返回true(或等效地,如果此列表因调用而更改)。