我正在使用“boolean java.util.ArrayList.contains(Object o)”方法在列表(ArrayList 类型)中查找特定对象。
以下链接 http://docs.oracle.com/javase/7/docs/api/下的方法描述 如下, “如果此列表包含指定元素,则返回 true。更正式地说,当且仅返回 true如果此列表包含至少一个元素 e 使得 (o==null ? e==null : o.equals(e))。"
所以我想做的是在一个名为 Person 的类中覆盖/重新定义“equals()”方法。然后在另一个名为“MyStorage”的类中,我想用 Person 类型的对象填充一个列表。在此之后,我想使用“contains()”方法来查找与我作为参数传递给 contains 方法的 Person 对象具有相同优先级编号的 Person 对象。当且仅当两个引用 x 和 y 引用同一个对象时,我不希望 contains 方法返回 true。相反,如果 x 和 y 具有相同的优先数,我希望 contains 方法返回 true。这就是为什么我在 Person 类中重写了 equals 方法的原因。问题是 contains 似乎是根据参考而不是在优先数上检查相等性。
下面是我的测试代码...
import java.util.ArrayList;
import java.util.Iterator;
@SuppressWarnings("serial")
public class MyStorage<E> extends ArrayList<E> {
public static void main(String [ ] args)
{
MyStorage<Person> list = new MyStorage<Person>();
Person p1 = new Person(1);
list.add(p1);
Person p2 = new Person(2);
list.add(p2);
list.add(new Person(3));
// This test code shows that the overridden equals method in class Person
// is not used by contains method. Right?
p1.setPrio(10);
if(list.contains(p1))
System.out.print("Found!");
}
public MyStorage(){
super();
}
// @Override
// public boolean contains(Object o){
// Iterator<E> itr = super.iterator();
// while(itr.hasNext()){
// System.out.print("Works!");
// }
// return false;
// }
}
// And the Person class....
public class Person {
private int prio;
public Person(int prio){
this.prio = prio;
}
@Override
public boolean equals(Object o){
if(o instanceof Person){
Person p = (Person) o;
if(this.prio == p.prio)
return true;
else
return false;
}else{
return false;
}
}
public void setPrio(int prio){
this.prio = prio;
}
}