java - 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 等于调用的函数
解决方案
你搞错了。
如果您检查源代码,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))
但这更冗长,并且可能比反过来做更慢。
推荐阅读
- reactjs - 使用useEffect在React上获取鼠标滚动事件在Chrome上不起作用
- javascript - 如何制作提交数据的拨动开关
- python - 线性回归如何更有效地预测?
- python - 带加密的 Python AES ECB 模式
- python - 带有 cartopy 的 Xarray facetgrid 地图使用某些数据集、投影和布局组合产生不可用的图
- javascript - 将带有全局变量的 javascript 包含到 typescript 模块中
- python - Sympy - C 代码的生成 - 奇怪的浮点转换
- jquery - Bootstrap Datepicker - 自定义样式
- postgresql - 不存在日期的 Postgres 查询
- php - 表格未以正确方式显示的模态