Java arrayList的equals永远不会被调用
我有一个客户机类,它包含类别对象的ArrayList。所以,当我想确保存在某种类别的Category对象时(我的意思是Categories名称是相同的),我会调用.contains()方法作为类别的数组列表 我在Category类中重写了.equals()方法,如下所示:Java arrayList的equals永远不会被调用,java,arraylist,contains,Java,Arraylist,Contains,我有一个客户机类,它包含类别对象的ArrayList。所以,当我想确保存在某种类别的Category对象时(我的意思是Categories名称是相同的),我会调用.contains()方法作为类别的数组列表 我在Category类中重写了.equals()方法,如下所示: @Override public boolean equals(Object object) { boolean isEqual = false; Log.d("Category", "IT WORKS");
@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方法从未被调用。
为什么会发生这种情况?来自:
布尔包含(对象o)
如果此列表包含 指定元素。
更正式地说,返回
true
当且仅当
列表至少包含一个元素e
,以便(o==null?e==null:o.equals(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可能在一个完全不同的类中(参数中的对象)。我这样测试它
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")));
}
name
是字符串吗?如果是这样,您应该使用等于
,而不是=
。另外,您不需要检查null
,因为SomeClass的null实例无论如何都会返回false。这些东西不会解决您的问题,但值得一看。尝试调试它肯定会调用,+您的equals()
,这里isEqual=(this.name=((Category)object.getName())中有一个bug
我假设name
是String
的,您使用了=
而不是equals()
您是否也覆盖了getHashCode()?你必须一直重写equals()。@Matt whyhashcode()
forArrayList
?@Jigar我想这是一种反射。我想你是对的-ArrayList不太可能使用hashCode()。我认为这是一个一般性的建议——如果没有hashCode(),equals()的问题迟早会出现。
true