校招刷题群
高效刷题 迎战校招
校招精选试题
近年面笔经面经群内分享
Java刷题群 前端刷题群 产品运营群
首页 > java语言 > equals、hashCode()
题目

hashCode什么时候需要重写?

解答

一般的地方不需要重载hashCode,只有当类需要放在HashTable、HashMap、HashSet等等hash结构的集合时才会重载hashCode。

那么为什么要重载hashCode呢?

要比较两个类的内容属性值,是否相同时候,根据hashCode 重写规则,重写类的指定字段的hashCode(),equals()方法。

例如

public class EmpWorkCondition{

/**
* 员工ID
*/
private Integer empId;

/**
* 员工服务总单数
*/
private Integer orderSum;

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
EmpWorkCondition that = (EmpWorkCondition) o;
return Objects.equals(empId, that.empId);
}

@Override
public int hashCode() {
return Objects.hash(empId);
}

// 省略 getter setter
}
public static void main(String[] args) {

List<EmpWorkCondition> list1 = new ArrayList<EmpWorkCondition>();

EmpWorkCondition emp1 = new EmpWorkCondition();
emp1.setEmpId(100);
emp1.setOrderSum(90000);
list1.add(emp1);

List<EmpWorkCondition> list2 = new ArrayList<EmpWorkCondition>();

EmpWorkCondition emp2 = new EmpWorkCondition();
emp2.setEmpId(100);
list2.add(emp2);

System.out.println(list1.contains(emp2));

}

输出结果:true

上面的方法,做的事情就是,比较两个集合中的,实体类对象属性值,是否一致

OrderSum 不在比较范围内,因为没有重写它的,equals()和hashCode()方法

为什么要重载equal方法?

因为Object的equal方法默认是两个对象的引用的比较,意思就是指向同一内存,地址则相等,否则不相等;
如果你现在需要利用对象里面的值来判断是否相等,则重载equal方法。

C 0条回复 评论

帖子还没人回复快来抢沙发