美文网首页Java 精选
写了这么多代码,你还不会去重实体类 ?

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

作者: Java_Pro | 来源:发表于2020-05-30 22:39 被阅读0次

    引言

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

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

    Set在插入数据判断依据

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

    概述

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

    • 你需要自定义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
    

    总结

    去重实体办法:

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

    根据自己的需求选择

    相关文章

      网友评论

        本文标题:写了这么多代码,你还不会去重实体类 ?

        本文链接:https://www.haomeiwen.com/subject/jjdkzhtx.html