不会调用arrayList的equals

时间:2014-05-19 18:37:03

标签: java arraylist contains

我有Client类,它包含Category对象的ArrayList。所以,当我想确保存在某种Category对象时(我的意思是类别名称是相同的),我为类别的数组列表调用.contains()方法。

我在Category类中覆盖了.equals()方法,如下所示:

@Override
public boolean equals(Object object) {
    boolean isEqual = false;
    Log.d("Category", "IT WORKS");
    if (object != null && object instanceof Category) {
        isEqual = (this.name == ((Category) object).getName());
    }

    return isEqual;
}

但是在控制台中我能够看到,equals方法永远不会被调用。 为什么会这样?

2 个答案:

答案 0 :(得分:1)

来自JavaDoc

  

boolean contains(Object o)
   如果此列表包含,则返回true   指定的元素   更正式的是,当且仅当这样时才返回true   列表包含至少一个元素e,使(o==null ? e==null : o.equals(e))   在contains接口

中指定为:Collection<E>

因此,当您致电list.contains(o)时,equals会在o上调用,而不是在列表元素上调用。

这样的东西
boolean contains(o)
{
    for every e in list loop
        if o.equals(e)
            return true
    end loop
    return false
}

根据您调用contains的方式及其参数,调用的equals可能位于完全不同的类中(参数中的对象)。

答案 1 :(得分:1)

我测试了它,

static class Category {
    public Category(String name) {
        this.name = name;
    }

    private String name;

    public String getName() {
        return name;
    }

    @Override
    public boolean equals(Object o) {
        if (o != null && o instanceof Category) {
            return this.getName().equals(((Category) o).getName());
        }
        return false;
    }
}

public static void main(String[] args) {
    List<Category> al = new ArrayList<>();
    al.add(new Category("test"));
    System.out.println(al.contains(new Category("test")));
}

输出

true