重写不调用equals的java索引

ve7v8dk2  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(358)

我想理解为什么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)));

输出:-1
注意,如果我这样做,函数equals被调用:

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

listTest.add(new Test(1));

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

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

j2datikz

j2datikz1#

你搞错了。
如果你检查源代码, 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))

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

lnlaulya

lnlaulya2#

您正在搜索 Integer 示例 List<Test> ,所以你不应该期望它找到匹配的。
是的,你的 equals 实施 Test 类可能返回 true 当你经过一个 Integer 但jdk可能使用 Integerequals 实现来比较 Integer 示例到 Test 示例 List<Test> ,因此找不到匹配项。

相关问题