写了这么多代码,你还不会去重实体类 ?

写了这么多代码,你还不会去重实体类 ?

引言

日常 coding 中经常遇到实体的集合,需要进行去重,一般都是交给java来执行,效率快,还不用操作数据库,之前听朋友说面试别人,经常有问到这个问题,其实很简单的问题.

可是还是有一部分答不上来,也有一部分答上来说重写equals与hashCode,虽然说说的是对的,但是用伪代码写出来的时候,还是写不出来

Set在插入数据判断依据

Set在插入数据时, 会先比对他们的 hashcode
如果hashcode相同,就会继续去比对equals,返回false会继续插入,true则跳过
假若hashcode不同,就会直接插入,因为hashcode不同的数据,equals一定为false

概述

简单来说,就是比对他们的equals与hashcode方法,重写之后
根据自己定义的来,哪怕你直接return true也是可以的

前提条件,先引入依赖

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.10</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
    <scope>provided</scope>
</dependency>

  • 你需要自定义equals
  • 你需要自定义几个属性的哈希码
  • 比对继承的对象使用super调用即可
        @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);
        }

假若实体很多,没个里面都加一个equals与hashcode方法,代码冗余

  1. 新增一个抽象类,用来继承使用,暂时没解决包含父类比对问题
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);
    }

}
  1. 使用Lombok , 加 @EqualsAndHashCode(callSuper = true) 注解

如果不想每个继承的类都加,那么就使用配置
在资源目录或者实体当前目录配置 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"}]

总结

去重实体办法:

  • 自定义重写equals方法,hashcode方法也要跟上
  • 使用 lombok 注解

根据自己的需求选择

猜你喜欢

转载自blog.csdn.net/Fine_Cui/article/details/106449063