Java arrayList的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");

我有一个客户机类,它包含类别对象的ArrayList。所以,当我想确保存在某种类别的Category对象时(我的意思是Categories名称是相同的),我会调用.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方法从未被调用。 为什么会发生这种情况?

来自:

布尔包含(对象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 why
hashcode()
for
ArrayList
?@Jigar我想这是一种反射。我想你是对的-ArrayList不太可能使用hashCode()。我认为这是一个一般性的建议——如果没有hashCode(),equals()的问题迟早会出现。
true