麻烦等于equals方法

时间:2014-03-12 09:24:12

标签: java collections

我创建了一个名为student的类,它有一个equals方法,如下所示。 我的问题是这个。

我创建了一个学生类的实例并将其添加到ArrayList,现在我想查看天气列表中包含学生对象的副本。当我尝试使用以下等于函数时,它会给出错误的结果。

例如。

    Student stud1= new Student(101,"Student1");
    Student stud5= new Student(105,"Student5");
    Student stud6= new Student(105,"Student5");
    list1.add(stud1);
    list1.add(stud5);
    System.out.println(list1.contains( new Student(105,"Student5")));// outputting false



class Student{
int sid;
String sname;

public Student(int sid,String sname){
    this.sid=sid;
    this.sname=sname;
}

public String toString(){
    return ""+this.sid;
}



public boolean equals(Student test){
    return  this.sid==test.sid; 
}

}

但是当我将equals函数替换为低于它的函数给出正确的结果时..为什么会这样?从技术上讲没有区别对吗?请问JVM如何查看代码,请帮助我。

    public boolean equals(Object cond){
    if(cond instanceof Student){
        Student test = (Student) cond;
        return test.sid==this.sid;
    }
    return false;
}

4 个答案:

答案 0 :(得分:10)

第一个equals(Student)方法不会覆盖Object#equals(Object)方法。因此,list.contains(Student)方法将调用默认的Object#equals()方法,并使用==比较引用。因此,对于两个不同的对象,它将返回false

答案 1 :(得分:1)

包含javadoc状态

  

如果此列表包含指定的元素,则返回true。更正式地,当且仅当此列表包含至少一个元素e时才返回true(o == null?e == null:o.equals(e))。

您必须覆盖equals(Object),在您的示例中定义equals(Student),这在调用list1.contains(时未使用。

答案 2 :(得分:1)

不,他们不一样。 为了使equals正常工作,您需要从超类(Object)覆盖该方法。并且重写的方法签名是

public boolean equals(Object cond){}

通过执行此操作public boolean equals(Student test){},您实际上正在重载该方法。因此,它不再是回调方法,而是调用了Object的equals方法。

答案 3 :(得分:1)

 public boolean equals(Object cond)

 public boolean equals(Student cond) 

有两种不同的方法签名

第一个,你正在重写Object类的equals方法。 (与Object.equals相同的签名

第二个重载方法。不同的签名。

要覆盖,方法签名必须类似。

这就是为什么equals(Object other)有效。