重写equals和hashCode的区别

1. 重写equals和hashCode区别

1.1 list中:不需要重写hashcode,重写会提高性能

重写equals是为了比较两个对象,目前需要在一个list中判断是否存在该对象
使用的是 clickRecordList.contains(clickRecord) ,这种情况其实是不需要重写hashCode的,list的contains中并没有利用hashcode去做比较

1.2 set和map中:需要重写hashcode

在set中,则是需要重写hashcode,set是不会将重复的对象添加进去,比较的是hashcode和equals,hashcode优先比较,而一般hashcode是对象的内存地址,自定义对象中需要重写不然每个对象内存地址都不同,到时equals不会生效。

@Test
    public void contains(){
        List<PacketClickRecord> clickRecordList = Lists.newArrayList(
                new PacketClickRecord("a", "1"),
                new PacketClickRecord("b", "2"),
                new PacketClickRecord("b", "3")
        );

        PacketClickRecord clickRecord = new PacketClickRecord("b", "3");
        if (clickRecordList.contains(clickRecord)){
            System.out.println("重写equals成功");
        }
    }

    @Test
    public void hashset(){
        HashSet set = Sets.newHashSet(
                new PacketClickRecord("a", "1"),
                new PacketClickRecord("b", "2"),
                new PacketClickRecord("b", "3")
        );
        // 没有重写hashcode时,该对象能够添加进去
        PacketClickRecord clickRecord = new PacketClickRecord("b", "3");
        set.add(clickRecord);
        System.out.println(set.size());
        set.forEach(System.out::println);
    }

@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class PacketClickRecord {
    private Integer clickRecord;

    private String openId;

    private Integer userAwardId;

    private String day;

    private String awardType;

    private String ortherDetail;

    @JsonIgnore
    private Date createdTime;

    @JsonIgnore
    private Date updatedTime;

    public PacketClickRecord(String openId, String awardType){
        this.openId = openId;
        this.awardType = awardType;
    }

    @Override
    public int hashCode() {
        return this.openId.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null)
            return false;

        if (obj instanceof PacketClickRecord){
            PacketClickRecord clickRecord = (PacketClickRecord)obj;
            if (clickRecord.getOpenId().equals(this.openId) && clickRecord.getAwardType().equals(this.awardType)){
                return true;
            }
        }

        return false;
    }
}    

2. 重写hashcode:提高性能

重写hashcode是为了提高性能,比如在HashSet或者HashMap场景中,添加一个对象进去是会先判断hashcode是否相同,相同再判断equals,这里面hashcode涉及到两个作用
① 若不重写hashcode,Object的hashcode是内存地址,每个对象实例是不同的,重写equals方法也没用,重复的元素还是会添加进去的
② 提高搜索效率:set在add前需要判断元素是否在当前set中已存在,若是通过equals方法比较,则是线性查找,有1000个元素的话,则要查找1000次,而使用hashcode则是在set内部维护一个table保存hashcode,先校验hashcode是否相同,校验次数就是桶bucket个数,能减少原本全部元素线性遍历的代价

3. 参考

https://www.kancloud.cn/this_is_lxf/javabase/210765

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值