==
:对于基本数据类型来说,比较的其存储的值,对于引用类型的变量比较的是对象的地址。
equals()
:默认是直接调用==,比较对象地址。String重写了equals()方法比较的是对象的内容。
public boolean equals(Object obj) {
return (this == obj);
}
hashcode()
:默认返回内存地址
一般重写equals就必须重写hashcode
原因:如果重写equals,不重写hashcode,对象就会默认使用Object的hashcode方法,导致equals相等,hashcode不同的情况。对象使用一些集合时就会出现错误,比如hashMap、hashset等集合都是先判断对象的hashcode是否相等,相等后再去判断equals。
简单写个例子:
//学生类
public class Student {
//姓名
private String name;
//学号
private String sno;
public Student() {
}
public Student(String name, String sno) {
this.name = name;
this.sno = sno;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSno() {
return sno;
}
public void setSno(String sno) {
this.sno = sno;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sno='" + sno + '\'' +
'}';
}
}
测试(没有重写equals和hashcode)
public class Test {
public static void main(String[] args) {
Student stu1=new Student("张三","01");
Student stu2=new Student("张三","01");
Student stu3=new Student("李四","02");
//对象在内存的地址
System.out.println(stu1.hashCode());
System.out.println(stu2.hashCode());
System.out.println(stu3.hashCode());
Set<Student> hashSet = new HashSet<>();
hashSet.add(stu1);
hashSet.add(stu2);
hashSet.add(stu3);
for (Student student : hashSet) {
System.out.println(student);
}
}
}
打印结果:张三为同一个人,却没有被去重。
1330106945
1279149968
59559151
Student{name='李四', sno='02'}
Student{name='张三', sno='01'}
Student{name='张三', sno='01'}
结果错误,测试(只重写eqauls不重写hashcode)
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Student)){//判断两个对象是否是一个类型的
return false;
}
Student student=(Student)obj;
return this.sno.equals(student.sno)&&this.name.equals(student.name);
}
重写hashcode()方法
@Override
public int hashCode() {
return this.sno.hashCode();//String重写了hashcode和equals方法
}
测试结果
1537
1537
1538
Student{name='张三', sno='01'}
Student{name='李四', sno='02'}
OK,是我们想要的结果了。
所以一般使用set存储的对象、自定义对象作为Map的key键等等hash结构的集合时,一定要重写hashcode和equals方法。
String重写了两个方法,所以可以作为key使用。
借鉴:https://blog.csdn.net/xlgen157387/article/details/88087963
如有不足,可留言交流!😀