学到hashset时遇到了这个问题
场景需求:因为要把属性一样的对象去重只存一次
解决方法:重写了hashcode和equals
问题来了,为什么?下面是自己的理解
提前明白一个事儿:
两个对象相等,hashcode一定相等
两个对象不等,hashcode不一定不等
hashcode相等,两个对象不一定相等
hashcode不等,两个对象一定不等
重点在中间两句。
原始的hashcode是object自带的,返回的hashcode就是对象的地址值。
现在的需求要求我们,属性相同的对象就要返回相同的hashcode
so we overwrite了 hashcode()
@Override
public int hashCode() {
return stuName.hashCode()+new Integer(stuAge).hashCode()+stuGender.hashCode();
}
先来一个弱筛选,大概率如果hashcode相同他们的各个属性就相同了。但是也有例外
比如:一个对象a属性1比对象b属性1的hashcode少了1,同时呢,对象a的属性2比对象b的属性2多了1。(纯个人理解猜测)一来一回计算的hashcode值是一样的,但是对象ab的属性是不一样的,那么equals方法的重写就派上用场了。印证了上述 hashcode相等,两个对象不一定相等。
重写equals方法目的就是简单粗暴地判断两个对象各个属性是否一样
@Override
public boolean equals(Object obj) {
boolean flag = false;
if(this == obj){//一个对象赋值三次,地址一样直接相同
flag = true;
}else{
if(obj instanceof Student){//要比较的对象是否是student类或者他的子类,不是不进入if直接return
Student stu = (Student)obj;
if(this.getStuName().equals(stu.getStuName())
&&this.stuAge==stu.getStuAge()
&&this.getStuGender().equals(stu.getStuGender())){
flag = true;
}
}
}
return flag;
}
至此完成。