Java重写equals方法实现去重


[toc]


我们经常会遇到一些业务,要对数据进行去重,我们可能首先想到的就是重写equals方法,但是结果却不尽人意,这是为啥呢?其实还需要重写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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package com.eicky;

public class Test {
private int id;
private String name;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public boolean equals(Object obj) {
if (obj == null){
return false;
}
if (this == obj){
return true;
}
if (obj instanceof Test){
Test o = (Test) obj;
return this.id == o.id;
}
return false;
}

@Override
public int hashCode() {
return id;
}

/**
* 这个是考虑到如果id是Integer类型的时候,没有具体值的时候就使用里面字符串的hashCode
*我们知道Java所有的类都是继承Object的,所有的类也都继承了Object的方法和属性
* eg: toString()、hashCode()、equals()等
*/
//@Override
//public int hashCode() {
// return name.hashCode();
//}
}

啰嗦几句:

当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true
当obj1.hashCode() == obj2.hashCode()为false时,obj1.equals(obj2)必须为false

重写这两个方法的作用就是为了去重,方式就不用多说了吧(Set什么的都能玩).
我们默认的去比对是否相同是比对的地址,而重写这两个方法就相当于比较两个对象是否相同就是去比对对象里面的内容

谢谢你请我吃糖,Mua
0%