为什么要重写hashCode和equal方法?
1.hashset不允许有重复的元素,当加入一个元素时,hashset要先判断集合中是否包含这个元素,如果包含那么返回false,如果不包含那么加入进去返回true
(1)那么如何判断两个元素是否相等呢?
* 首先先判断连个元素的hashCode值是否一样,若hashCode值一样,则说明两元素相同返回fasls,如果hashCode不一样则可能不相同*
(2)然后再判断equal是否为真,若为真则两元素相同
那么为什么不直接判断eauqal呢?
判断hashCode所计算的次数少,因为一个元素的hashCode只用计算一次
-----------------------------------------------------------------------------------------------------------------------
以下是一个具体的案例,包含重写hashCode和equal方法
-
问题描述
指定放入
HashSet
集合中的元素类型必须为Student
,不能存在重复元素,需要在Student
类中重写hashCode()
和equals()
方法才能实现功能,如果忘了如何重写这两个方法,建议回头再去看一下之前 2.2 Set 接口章节中重写hashCode()
和equals()
方法的课程知识内容,才能完成本次挑战。 -
解题思路
-
Student
类中需要提供两个String
类型的属性:name
学生姓名和grade
学生年级,分别提供相应的get
和set
方法; -
在
Student
类中需要重写toString()
方法,便于学生信息的输出,并需要按以下结构输出:?Student:name=小桃子,grade=三年级
注意:
- 需要使用英文状态下的符号;
- 字符中间不要包含空格,否则会影响本次挑战的正确率。
-
在
Student
类中重写hashCode()
和equals()
方法,才能保证不会录入重复数据。 -
在
StudentService
类中添加addStudent()
方法,在方法中将Student
学生信息存储到HashSet
集合中,Student
对象添加到HashSet
任务完成方法返回true
,如果出现异常则返回false
,以下是提供录入学生信息,必须按照提供的信息录入,否则会影响挑战无法正确通过。new Student("张三","一年级") new Student("李四","二年级") new Student("小桃子","三年级") new Student("张三","一年级")
?注意:最后一个学生信息应该是无法存储到集合中的。
-
在
StudentService
类中添加showStudent()
方法,方法中采用foreach
循环方式进行数据元素遍历,并进行打印输出。 -
在
StudentService
类main
方法中调用addStudent()
方法后需要打印出相应信息,方法调用后返回值为true
时返回字符串 “学生信息录入成功” ,返回值为false
时返回字符串 “学生信息录入失败”。 -
输出的信息必须按照要求内容要求进行书写,不能随意扩展。
-
-
我的代码
这是定义的一个Student的类,在这里面重写equal和hashCode方法
用于比较放个对象是否相同
public class Student {
private String name;
private String grade;
public Student(String name, String grade) {
this.name = name;
this.grade = grade;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
public String toString() {
String result="Student:name="+name+",grade="+grade;
return result;
}
@Override
public int hashCode() {
return name.hashCode()+grade.hashCode();
}
@Override
public boolean equals(Object obj) {
if(this==obj){
return true;
}
else if(obj instanceof Student){
Student s=(Student)obj;
if(name.equals(s.getName())&&grade.equals(s.getGrade())){
return true;
}
else{
return false;
}
}else{
return false;
}
}
}
import java.util.HashSet;
public class StudentService {
static HashSet<Student> students=new HashSet<Student>();
public static void main(String[] args) {
if(addStudent()){
System.out.println("学生信息录入成功");
}else{
System.out.println("学生信息录入失败");
}
showStudent(students);
}
public static Boolean addStudent(){
students.add(new Student("小桃子","三年级"));
students.add(new Student("张三","一年级"));
students.add(new Student("李四","二年级"));
students.add(new Student("张三","一年级"));
if( students.contains(new Student("张三","一年级"))&&
students.contains(new Student("李四","二年级"))&&
students.contains(new Student("小桃子","三年级"))
)
{
return true;
}
else{
return false;
}
}
public static void showStudent(HashSet<Student> hs){
for(Student s:hs){
System.out.println(s.toString());
}
}
}
hashCode和equal方式是重写方法记得加上override以免出错,重写的方法体,参数列表是不可以改的