不调用equals的Java索引
我想了解为什么indexOf函数不调用overrides方法equals。我有这门课:不调用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
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))