首页 > 解决方案 > Java indexOf 不调用等于

问题描述

我想了解为什么 indexOf 函数不调用覆盖方法 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)));

输出:-1


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

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

listTest.add(new Test(1));

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

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

标签: javaoverridingequalsindexof

解决方案


你搞错了。

如果您检查源代码equals则调用 的参数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))

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


推荐阅读