.equals()工作时List.contains()失败 - java

我有一个ArrayList对象的Test,它使用字符串作为等效性检查。我希望能够使用List.contains()来检查列表中是否包含使用特定字符串的对象。

只是:

Test a = new Test("a");
a.equals("a"); // True

List<Test> test = new ArrayList<Test>();
test.add(a);
test.contains("a"); // False!

等于和哈希函数:

@Override
public boolean equals(Object o) {
    if (o == null) return false;
    if (o == this) return true;
    if (!(o instanceof Test)) {
        return (o instanceof String) && (name.equals(o));
    }
    Test t = (Test)o;
    return name.equals(t.GetName());
}

@Override
public int hashCode() {
    return name.hashCode();
}

我读到要确保contains适用于自定义类,需要重写equals。因此,对我来说,奇怪的是,虽然equals返回true,但是contains返回false。

我该如何工作?

Full code

参考方案

仅仅因为您的Testequals在将字符串传递给它时可能返回true,并不意味着当您向其传递String实例时equalsTest将永远返回true。实际上,当传递给它的实例是另一个String时,equalstrue只能返回String:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) { // the passed instance must be a String
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

ArrayListcontains调用indexOf,它使用搜索到的实例的equals方法(在您的示例中为String“a”),而不是List的元素类型(在您的情况下为Test):

public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
            if (elementData[i]==null)
                return i;
    } else {
        for (int i = 0; i < size; i++)
            if (o.equals(elementData[i])) // o in your case is a String while
                                          // elementData[i] is a Test
                                          // so String's equals returns false
                return i;
    }
    return -1;
}

Java:如果我覆盖.equals方法,是否仍可以使用==测试引用相等性? - java

我有以下情况:我需要根据高度对树进行排序,因此我使用height属性使Tree成为可比较树。但是,我还被告知要覆盖equals和hashCode方法,以避免不可预测的行为。尽管如此,有时我还是想使用==比较根目录或类似内容的参考。这是否仍然可能或==比较调用equals方法? 参考方案 equals()用于将对象与程序员设置的规则进行比较。在您的示例中,您按…

为什么Entry接口定义了equals和hashCode之类的方法? - java

我看到接口java.util.Map.Entry具有方法:boolean equals(Object o); int hashCode(); 当从Entry类继承相同的方法时,为什么上述方法是Object接口的一部分?感谢致敬,拉胡尔 参考方案 有三点要考虑:从技术角度来看,这不是必需的:每个类都从Object类继承这两个方法。从技术上讲,将这两种方法添加到…

Java不平等是可传递的吗? - java

如果我有3个对象a,b和c,并且想要检查它们是否彼此相等,则需要检查:if (!a.equals(b) && !b.equals(c) && !a.equals(c)) { // to simplify, assume non-null // do something } 根据Java文档,对于正确实现的equals方法: 它…

List.contains()没有返回正确的结果,但是手动搜索确实 - java

我的代码发生了一个奇怪的问题: RestAPIHeader requestedBy = new RestAPIHeader("X-Requested-By", "test"); // Act RestAPIRequest req = prepareLoginRequest(USER_NAME, PASSWORD); /…

使用hashCode实现等于否吗? - java

我一直在尝试以下equals和hashCode的实现:@Override public boolean equals(Object obj) { return obj != null && hashCode() == obj.hashCode(); } @Override public int hashCode() { return new …