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

hashCode什么时候需要重写?

解答

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

那么为什么要重载hashCode呢?

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

例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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条回复 评论

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