equals(Object o)方法
1.作用,比较两个数据是否相同
2.为什么要重写equals方法
由于Object类是所有类的父类,当没有重写equals方法时,使用的是Object类的equals方法(有些类底层重写了equals方法 eg:String类底层重写了equals方法)
Object类的equals方法
public boolean equals(Object obj) {
return (this == obj);
}
在有些时候,这个父类方法并不能满足需求
eg:我们认为学号和名字相同就是一个人
package text2;
public class student {
int id;
String name;
public student(int id, String name) {
this.id = id;
this.name = name;
}
}
package text2;
public class Main {
public static void main(String[] args) {
student student1=new student(1,"小明");
student student2=new student(1,"小明");
System.out.println(student1.equals(student2));
}
}
结果是控制台最后输出的是false;
因为没有重写equals方法,所以调用的是父类的equals方法,
所以
System.out.println(student1.equals(student2));
等于
System.out.println(student1==student2);
他们比较的是student1和student2对象所指向的地址,他们的所指向的地址不同,当然就是false;
此时我们需要在student 类中重写equals方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
student student = (student) o;
return id == student.id &&
Objects.equals(name, student.name);
}
此时运行Main类,比较的是学号和名字,只有学号和名字都相同则为true
最后运行结果为true;
hashCode()方法
作用:返回某个数据的hash值
1.hash值有什么用?
以一个只能存储不同元素的集合为例
如何保证集合中元素的唯一性
方案一:很多人可能惯性认为,每添加一个元素,就遍历一下集合,在遍历过程中顺便用添加元素的equals方法来和遍历的数据进行比较;可以达到目的,但假如数据大了,非常影响添加元素的速度
方案二:利用hash值存储元素:当存储下一个元素时,利用该元素的hash值来找到存储位置,如果该位置有元素,则利用该元素的equals方法来判断是否为相同元素,如果是则不存,如果不是则重新计算不一样的hash值,再次利用hash值存储该元素;
2.为什么要重写equals方法时也要重写hashCode()方法;
以student为例:我们认为id相同的学生数据为同一数据,
按照上面的equals方法讲解,我们需要重写该类的equals方法
(没有重写hashCode方法)
package text2;
public class student {
int id;
String name;
public student(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
student student = (student) o;
return id == student.id;
}
@Override
public String toString() {
return "student{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
然后我们把两条学生数据添加进HashSet集合
public static void main(String[] args) {
student student1=new student(1,"小明");
student student2=new student(1,"小红");
HashSet<student>students=new HashSet<>();
students.add(student1);
students.add(student2);
System.out.println(students);
}
最后结果是
[student{id=1, name=‘小红’}, student{id=1, name=‘小明’}]
按照要求应该id相同就是同一数据
为什么student1和student2都会添加进来?
因为student没有重写hashCode()方法,所以使用的是父类Object的hashCode()方法
student1和student2算出的hash值不同,所以会认为是不同数据
解决方法:重写hashCode()
@Override
public int hashCode() {
return Objects.hash(id);
}