我使用“boolean java.util.ArrayList.contains(Object o)”方法查找列表中的特定对象(类型为ArrayList)。
以下链接中的方法说明, http://docs.oracle.com/javase/7/docs/api/ 说明以下内容, “如果此列表包含指定的元素,则返回true。更正式地,当且仅当此列表包含至少一个元素e时才返回true(o == null?e == null:o.equals(e) )“。
所以我想要做的是在名为Person的类中重写/重新定义“equals()”方法。然后在另一个名为“MyStorage”的类中,我想用Person类型对象填充列表。在此之后,我想使用“contains()”方法来查找一个Person对象,该对象具有与作为contains方法的参数传递的Person对象相同的prio编号。当且仅当两个引用x和y引用同一个对象时,我不希望contains方法返回true。相反,如果x和y具有相同的prio数字,我希望contains方法返回true。这就是为什么我在Person类中重写了equals方法。问题是包含似乎基于引用检查相等性而不是prio数。
以下是我的测试代码......
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;
}
}
答案 0 :(得分:0)
通过调用p1.setPrio(10);
,您正在更改prio
中p1
,即存储中的确切实例,因此equals()
显然应该返回true
,因为您正在将实例与自身进行比较。
答案 1 :(得分:-2)
在这种情况下,您要将Person实例添加到ArrayList,您的测试代码无法正常工作,因为您没有添加新的Person(4)。尝试下一个,
import java.util.ArrayList;
@SuppressWarnings("serial")
public class MyStorage<E> extends ArrayList<E> {
public static void main(String [ ] args){
MyStorage<Person> list = new MyStorage<Person>();
list.add(new Person(1));
list.add(new Person(2));
list.add(new Person(3));
list.add(new Person(4));
if(list.contains(new Person(4))){
System.out.print("Found!");
}else{
System.out.print("Not found");
}
}
}
如果重写equals()方法,则必须重写hasCode()方法。无论如何,hashCode()方法用于基于散列函数的结构。在这种情况下,一个不使用散列函数的ArrayList,只能覆盖equals()方法,它必须工作,但不是一个好方法,并且如上所述,你应该重写equals和hasCode at同时。