[英]Method “contains”.Java List
我有Spring MVC应用程序。 我有实体课考试。 我重写方法eqauls所以我可以使用包含List接口的方法。 当我尝试添加新考试时,我看看是否已经添加了它。 但是当我通过考试对象到mathod包含时,我总是有不同的学生。 例如:我需要在Student Jone中添加考试。 我尝试添加它并获得另一个信息:Kate:Jone,而不是Jone:Jone。 我不知道为什么我会发生,因为当我将学生设为Jone时,我通过考试对象。
@Override
public boolean equals(Object arg) {
Examination exam = (Examination) arg;
System.out.println(exam.getStudent().getStudentFullName() + ":" + this.getStudent().getStudentFullName());
if (!this.subject.getSubjectTitle().equals(exam.getSubject().getSubjectTitle()))
return false;
else
return true;
}
我尝试添加考试的一段代码
examination.setStudent(currentStudent); // set student
examination.setSubject(subjectExam); // set subject
if(es.selectAllExams().contains(examination)) {
return "error";
} else {
es.insertExam(examination); // add to database
return "success";
}
在equals方法中,您只比较标题,而不是学生姓名。 因此,如果您有两个相同标题的考试,但不同的学生名称相同(基于您的等于方法)。 比较equals方法的学生,你应该是好的。 通常,优先考虑覆盖equals和hashcode方法。
您的equals方法的实现通常不遵循覆盖equals方法的最佳实践。 谷歌有点“java equals方法最佳实践” - 你会发现这样的东西: http : //javarevisited.blogspot.sk/2011/02/how-to-write-equals-method-in-java.html
如果你懒得编写自己的equals或hashcode方法(或者你有其他原因),你可以使用:
要么
你说你重写equals()
所以我可以使用包含List接口的方法
但是,你没有覆盖该方法使用contains()
有一个适合大多数用途的默认实现; 归结为“这些对象是同一个实例吗?”。 正如之前的响应者指出的那样,你的实现正在打破这种逻辑; 所有具有相同标题的考试都将被视为同一个对象,因此只要您的列表中有一个与您要添加的考试具有相同标题的考试,则contains()
检查将始终返回true
,您将永远不能再添加另一个。
如果你想平等的基础上讨论的题目和学生,那么以前的答案是正确的-你要同时重写hashCode()
和equals()
,确保您认为重要的是要检查的身份在各个领域两种方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.