0

我正在使用“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;
    }
}
4

1 回答 1

0

通过调用p1.setPrio(10);您正在更改存储priop1的确切实例,因此很明显equals()应该返回true,因为您正在将实例与其自身进行比较。

于 2013-06-09T16:40:08.683 回答