我想理解为什么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等于调用的函数
2条答案
按热度按时间j2datikz1#
你搞错了。
如果你检查源代码,
equals
是基于indexOf
,而不是元素。所以,Integer.equals
正在调用,而不是Test.equals
.那是
if (o.equals(elementData[i]))
,而不是if (elementData[i].equals(o))
.我想这样做是因为
elementData[i]
可能为空。当然,您可以添加一个空检查:但这更冗长,而且可能比反过来慢。
lnlaulya2#
您正在搜索
Integer
示例List<Test>
,所以你不应该期望它找到匹配的。是的,你的
equals
实施Test
类可能返回true
当你经过一个Integer
但jdk可能使用Integer
的equals
实现来比较Integer
示例到Test
示例List<Test>
,因此找不到匹配项。