我创建了一个名为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;
}
答案 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)
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)有效。