使用boolean java.util.ArrayList.contains(Object o)方法。确定哪两个对象相等

时间:2013-06-09 16:07:31

标签: java

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

2 个答案:

答案 0 :(得分:0)

通过调用p1.setPrio(10);,您正在更改priop1,即存储中的确切实例,因此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同时。