Java 怎么重写 Hash 和 equals
Aidan Engineer

Java 的 euqals()hashCode() 可以说是最常用的两个 Object 方法,那具体怎么重写这两个方法才能做到真正的实用和有效呢?

其实大致思路都是相同的,不过是判断地址和转型后判断属性,但转型和判断属性的方式还要考虑到子类继承的情况,下面是阅读《Java 修炼指南》后的总结写法

首先贴一下代码:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.util.Objects;

/**
* Created by Aidan on 2021/11/8 20:05
* GitHub: github.com/huaxin0304
* Blog: aidanblog.top
*/

public class Person {

int id;
String name;

@Override
public boolean equals(Object obj) {
// 1. 判断引用是否相等
if (this == obj) {
return true;
}

// 2. 判断传入的对象是否为空
if (obj == null) {
return false;
}

// 3. 判断类型是否相等,考虑到子类继承后重写的情况所以不使用 `instanceof`
// if (!(o instanceof Person)) return false;
if (this.getClass() != obj.getClass()) {
return false;
}

// 4. 进行类型转换
Person person = (Person) obj;

// 5. 进行属性的判断(应该使用 `getXXX()` 的方式,这里为了简便)
return this.id == person.id && Objects.equals(this.name, person.name);
}

@Override
public int hashCode() {
return Objects.hashCode(this);
// return Objects.hash(this.id, this.name);
}
}

其实大部分的使用都是相同的,只是在判断类型时有些不同,这里主要是考虑到类继承后重写父类(自定义)的 euqals() 方法,导致判断方式各异的情况,如下:

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
public class Person {
int id;
String name;
...
}

public class Man extends Person {
}

public class Women extends Person {
String favor;

@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}

if (this.getClass() != obj.getClass()) {
return false;
}

Women women = (Women) obj;

return this.id == women.id && this.name.equals(women.name) && this.favor.equals(women.favor);
}
}
  • 本文标题:Java 怎么重写 Hash 和 equals
  • 本文作者:Aidan
  • 创建时间:2021-11-10 17:43:34
  • 本文链接:https://aidanblog.top/native_code-overrid_and_equals/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论