日常 coding 中经常遇到实体的集合,需要进行去重,一般都是交给java来执行,效率快,还不用操作数据库,之前听朋友说面试别人,经常有问到这个问题,其实很简单的问题.
可是还是有一部分答不上来,也有一部分答上来说重写equals与hashCode,虽然说说的是对的,但是用伪代码写出来的时候,还是写不出来
Set在插入数据时, 会先比对他们的 hashcode
如果hashcode相同,就会继续去比对equals,返回false会继续插入,true则跳过
假若hashcode不同,就会直接插入,因为hashcode不同的数据,equals一定为false
简单来说,就是比对他们的equals与hashcode方法,重写之后
根据自己定义的来,哪怕你直接return true也是可以的
前提条件,先引入依赖
org.apache.commons
commons-lang3
3.10
org.projectlombok
lombok
1.18.12
provided
@Override
public int hashCode() {
return (this.child + super.getOjbk()).hashCode();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
B b = (B) o;
return Objects.equals(b.getOjbk(), super.getOjbk())
&& Objects.equals(b.getChild(), this.child);
}
public abstract class EqualsHashcode {
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
return EqualsBuilder.reflectionEquals(this, o);
}
}
如果不想每个继承的类都加,那么就使用配置
在资源目录或者实体当前目录配置 lombok.config
lombok.config
config.stopBubbling=true
lombok.equalsAndHashCode.callSuper=call
package test.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import lombok.Data;
import java.util.HashSet;
import java.util.Set;
public class TestEquals {
public static void main(String[] args) {
B b = new B();
b.setChild("aaa");
b.setName("bbb");
b.setOjbk("ccc");
B b1 = new B();
b1.setChild("aaa");
b1.setName("bbb");
b1.setOjbk("ccc");
Set<B> set = new HashSet<B>() {
{
add(b);
add(b1);
}};
System.out.println(JSON.toJSONString(set, SerializerFeature.WriteMapNullValue));
}
@Data
static class A {
private String ojbk;
private String name;
}
@Data
static class B extends A {
private String child;
}
}
输出:
[{
"child":"aaa","name":"bbb","ojbk":"ccc"}]
去重实体办法:
根据自己的需求选择