我有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方法永远不会被调用。 为什么会这样?
答案 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