现场场景如下:
我们有一个学生类,其成员变量如下:
private String name;
private char sex;
private Integer age;
private Double score;
提供有参构造方法
public Student(String name, char sex, Integer age, Double score) {
super();
this.name = name;
this.sex = sex;
this.age = age;
this.score = score;
}
我们创建一个HashSet对象,然后创建两个学生对象添加进去,最后我们输出一下该set的大小
不难想象,结果为"2",即此时HashSet将其作为了两个不同的对象存了进去
下面我们重写其hashCode方法与equals方法(未作修改)
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((age == null) ? 0 : age.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((score == null) ? 0 : score.hashCode());
result = prime * result + sex;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age == null) {
if (other.age != null)
return false;
} else if (!age.equals(other.age))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (score == null) {
if (other.score != null)
return false;
} else if (!score.equals(other.score))
return false;
if (sex != other.sex)
return false;
return true;
}
现在我们有一个需求,如果所添加学生的年龄不超过5岁,成绩不超过10分,我们就将其作为同一对象,换言之就是在Hashset中不能重复添加,我们该如何实现呢?
这就需要我们知道HashSet是如何判断对象是否唯一的标准
是对象的equals方法吗?
我们修改equals方法如下:
添加对象如下
可是还是失败了,输出结果依然为"2",可见equals方法并没有作为该依据,但是真的是这样吗?通过后续发现,其实不然,equals方法其实是作为其判断的第二步的,那第一步是什么呢?
是hashCode方法
我们看一下原本的hashCode方法
可见其所有参数都参与的运算,最起码我们可以想象到其返回值绝对不是一个相同的值
那我门将其返回值固定,结果会怎样呢?
不出所然,成功了
HashSet将其作为了同一对象
如果我们将equals方法如果复原,则其又添加上了
代码温柔一点:
上述直接定义hashCode()方法的返回值的操作太粗鲁了,我们应该将其它元素考虑进去,即name属性值与sex属性值应参加进去,代码如下:
总结:
Hashset在添加对象的时候,判断其是否为同一元素对象的过程分为两步
第一步: 调用对象的hashCode()方法,如果返回值不同,即为不同对象,直接添加成功
第二步: 调用对象的equals()方法,我们的需求条件需要在此处进行修改
转载:https://blog.csdn.net/baidu_41672408/article/details/106938889