重写equals()方法和hashCode()方法
1、为什么重写equals()方法
Object类中的equals方法和“==”是一样的,没有区别,即俩个对象的比较是比较他们的栈内存中存储的内存地址。而String类,Integer类等等一些类,是重写了equals方法,才使得equals和“==不同”,他们比较的是值是不是相等。所以,当自己创建类时,自动继承了Object的equals方法,要想实现不同的等于比较,必须重写equals方法。
2、为什么重写hashCode()方法
hashset在存储对象时,先判断两个对象的hash值是否一样,只有在hashcode()相等的前提下equals()也相等,才认为两个对象时同一个。
3、举例子
假设需要记录学生的成绩,每个学生本身有姓名,年龄,性别几个属性,把姓名、性别、年龄都一样的当成是同一个人(虽然不严谨)。学生对象自然就是key,成绩是Value
代码:
class Student {
String name;
int age;
//true表示男,false表示女
boolean sex;
@Override
public int hashCode() {
int result = 17;
result = 37*result+name.hashCode();
result = 37*result+age;
result = 37*result+(sex ? 0 : 1);
return result;
}
@Override
public boolean equals(Object obj) {
return obj instanceof Student &&
this.name.equals(((Student)obj).name) &&
this.age == ((Student)obj).age &&
this.sex == ((Student)obj).sex;
}
}