Java indexOf 没有调用 equals

Java indexOf not calling equals

我想了解为什么 indexOf 函数不调用覆盖方法 equals。我有这个 class :

class Test {
    public Integer _test;

    public Test(Integer test) {
        _test= test;
    }

    @Override
    public int hashCode() {
        return Objects.hash(_test);
    }

    @Override
    public boolean equals(Object obj) {
        System.out.println("equals function called");
        if (!(obj instanceof Integer)) return super.equals(obj);
        Integer test = (Integer) obj;
        return _test == test;
    }
}

这是我的主代码:


List<Test> listTest = new Arraylist<Test>();

listTest.add(new Test(1));

System.out.println(listTest.indexOf(new Integer(1)));

输出:-1


请注意,如果我这样做,函数 equals 将被调用:

List<Test> listTest = new Arraylist<Test>();

listTest.add(new Test(1));

System.out.println(listTest.indexOf(new Test(1)));

输出:-1 等于调用的函数

您正在 List<Test> 中搜索 Integer 个实例,因此您不应期望它能找到匹配项。

是的,当您向 Test class 传递 Integer 时,您的 equals 实现可能 return true是一个糟糕的实现),但是 JDK 可能使用 Integerequals 实现来比较 Integer 实例与 [=11] 的 Test 实例=],因此找不到匹配项。

你理解错了。

If you check the source codeequals 是在 indexOf 的参数上调用的,而不是元素。因此,正在调用 Integer.equals,而不是 Test.equals

    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]))
                    return i;
        }
        return -1;
    }

那是 if (o.equals(elementData[i])),而不是 if (elementData[i].equals(o))

我想这样做是因为 elementData[i] 可能为空。当然,您可以添加空检查:

               if (elementData[i] != null && elementData[i].equals(o))

但这比反过来更冗长,而且可能更慢。