代码之家  ›  专栏  ›  技术社区  ›  Thomas Winsnes

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

  •  26
  • Thomas Winsnes  · 技术社区  · 16 年前

    当调用Java中的ARAYLIST中的Object(对象O)时,它如何比较对象以找到正确的对象来移除?它使用指针吗?或者使用接口比较对象?

    4 回复  |  直到 10 年前
        1
  •  16
  •   Vasily Kabunov Yashvir yadav    10 年前

    ArrayList remove() 依赖对象实现 Equal 方法。如果尚未执行任何实现,则该对象将由 Object 的实现 Equals 这确实是指针比较。

    从上的文档 数组列表 -

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

    对象 equal 方法文件-

    类对象的equals方法在对象上实现了最明显的可能等价关系;也就是说,对于任何非空引用值。 x 和 y ,此方法仅当且仅当 X 和 Y 引用同一对象( x == y 具有价值 true )

        2
  •  8
  •   polygenelubricants    16 年前

    对于这种信息,您应该始终咨询API。

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

    也许你把这个和例如 TreeSet :

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

    (不幸的是,例如 TreeSet.remove 方法本身没有任何关于上述警告的明确提示,但至少它被显著地放在类文档的顶部)


    一个说明性的例子

    下面的代码段说明了使用 等于 (如: ArrayList )以及使用 compare/compareTo (如A) 有序树 )

    import java.util.*;
    
    public class CollectionEqualsCompareTo {
        static void test(Collection<Object> 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<Object>() {
                // 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<Object>() {
                // 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<Object>(), broken1); // true true false true
            test(new TreeSet<Object>(),   broken1); // false false false false
            test(new ArrayList<Object>(), broken2); // false false false false
            test(new TreeSet<Object>(),   broken2); // true true false true
        }
    }
    
        3
  •  1
  •   leonbloy    16 年前

    这个 docs 回答你的问题:

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

        4
  •  1
  •   YGL    16 年前

    它使用 equals()

    从 docs :

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