Java indexOf 没有调用 equals
Java indexOf not calling equals
我想了解为什么 indexOf 函数不调用覆盖方法 equals。我有这个 class :
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 等于调用的函数
您正在 List<Test>
中搜索 Integer
个实例,因此您不应期望它能找到匹配项。
是的,当您向 Test
class 传递 Integer
时,您的 equals
实现可能 return true
是一个糟糕的实现),但是 JDK 可能使用 Integer
的 equals
实现来比较 Integer
实例与 [=11] 的 Test
实例=],因此找不到匹配项。
你理解错了。
If you check the source code、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))
但这比反过来更冗长,而且可能更慢。
我想了解为什么 indexOf 函数不调用覆盖方法 equals。我有这个 class :
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 等于调用的函数
您正在 List<Test>
中搜索 Integer
个实例,因此您不应期望它能找到匹配项。
是的,当您向 Test
class 传递 Integer
时,您的 equals
实现可能 return true
是一个糟糕的实现),但是 JDK 可能使用 Integer
的 equals
实现来比较 Integer
实例与 [=11] 的 Test
实例=],因此找不到匹配项。
你理解错了。
If you check the source code、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))
但这比反过来更冗长,而且可能更慢。