不调用equals的Java索引

不调用equals的Java索引,java,overriding,equals,indexof,Java,Overriding,Equals,Indexof,我想了解为什么indexOf函数不调用overrides方法equals。我有这门课: class Test { public Integer _test; public Test(Integer test) { _test= test; } @Override public int hashCode() { return Objects.hash(_test); } @Override pub

我想了解为什么indexOf函数不调用overrides方法equals。我有这门课:

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)));


List listTest=新建Arraylist();
添加(新测试(1));
System.out.println(listest.indexOf(新整数(1));
输出:-1


请注意,如果执行此操作,将调用函数equals:

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

listTest.add(new Test(1));

System.out.println(listTest.indexOf(new Test(1)));
List listest=new Arraylist();
添加(新测试(1));
System.out.println(listTest.indexOf(新测试(1));

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

您正在
列表
中搜索一个
整数
实例,因此您不应该期望它找到匹配项


是的,
Test
类中的
equals
实现可能会在向其传递
整数时返回
true
(这是一个糟糕的实现),但是JDK可能使用
Integer
equals
实现将
Integer
实例与
列表的
测试
实例进行比较,因此找不到匹配项。

您搞错了

,对
indexOf
的参数调用
equals
,而不是元素。因此,调用的是
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;
    }

但这更为冗长,可能比另一种方式更慢。

FYI,您正在破坏
equals
的契约,例如,其中的一部分说“它是对称的:对于任何非空参考值x和y,x.equals(y)应该返回true,当且仅当y.equals(x)返回true。”
               if (elementData[i] != null && elementData[i].equals(o))