sta*_*max 0 java overriding equals 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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的主要代码:
List<Test> listTest = new Arraylist<Test>();
listTest.add(new Test(1));
System.out.println(listTest.indexOf(new Integer(1)));
Run Code Online (Sandbox Code Playgroud)
输出:-1
请注意,如果我这样做,则调用 equals 函数:
List<Test> listTest = new Arraylist<Test>();
listTest.add(new Test(1));
System.out.println(listTest.indexOf(new Test(1)));
Run Code Online (Sandbox Code Playgroud)
输出:-1 等于调用的函数
你弄错了方法。
如果您检查源代码,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;
}
Run Code Online (Sandbox Code Playgroud)
那是if (o.equals(elementData[i])),而不是if (elementData[i].equals(o))。
我想它是这样做的,因为elementData[i]可能为空。当然,你可以添加一个空检查:
if (elementData[i] != null && elementData[i].equals(o))
Run Code Online (Sandbox Code Playgroud)
但这更冗长,而且可能比反过来更慢。
| 归档时间: |
|
| 查看次数: |
62 次 |
| 最近记录: |