【发布时间】:2014-08-15 08:42:20
【问题描述】:
请考虑以下代码(非常简单)
public class Main {
public static class A{
int id;
public A(final int id){
this.id = id;
}
@Override
public boolean equals(final Object obj) {
if(obj instanceof A){
final A a = (A) obj;
return id == a.id;
}
return false;
}
}
public static void main(final String[] args) {
final List<A> items = new ArrayList<A>();
items.add(new A(0));
items.add(new A(1));
final Object obj = new A(1);
System.out.println(items.indexOf(obj));
}
}
当我运行此代码时,1 将记录在控制台中。在我看来,它不应该是1,而应该是-1。我调查了indexOfsource code。从那里完全复制/粘贴:
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;
}
我们知道当我的代码想要运行时,上面代码的else 段开始执行。正如您在其中看到的,将执行语句o.equals(elementData[i])。到目前为止一切正常,我没有任何问题
我的问题
上述方法中变量o的类型是Object,当我们调用它的equals方法时,我认为通用对象的equals方法将被执行,在另一边我已经查看对象source code 的equals 方法。我在这里复制/粘贴它:
public boolean equals(Object obj) {
return (this == obj);
}
现在,在 indexOf 方法的 for 循环中,不应有任何项目与 o 对象匹配,因为数组中没有等于 o 对象的项目,在 ==观点
现在我想知道我的代码输出如何等于1。谁能帮帮我?
谢谢
【问题讨论】: