Java基础不简单,谈谈hashCode()和equals()

本文探讨了Java中hashCode()和equals()方法的重要性。在Java开发规范中,当重写equals()时,通常需要同时重写hashCode()。文章通过实例解释了不重写hashCode()可能导致Set集合无法正确去重的问题,并指出哈希码不相等的对象一定不相同,而哈希码相等的对象可能相同,取决于equals()的比较结果。总结强调了这两个方法在HashSet和HashMap中的关键角色,提醒开发者注意避免业务错误。
摘要由CSDN通过智能技术生成

文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary

写在前面

其实很早我就注意到阿里巴巴Java开发规范有一句话:只要重写 equals,就必须重写 hashCode

我想很多人都会问为什么,所谓知其然知其所以然,对待知识不单止知道结论还得知道原因。

hashCode方法

hashCode()方法的作用是获取哈希码,返回的是一个int整数

学过数据结构的都知道,哈希码的作用是确定对象在哈希表的索引下标。比如HashSet和HashMap就是使用了hashCode方法确定索引下标。如果两个对象返回的hashCode相同,就被称为“哈希冲突”。

equals方法

equals()方法的作用很简单,就是判断两个对象是否相等,equals()方法是定义在Object类中,而所有的类的父类都是Object,所以如果不重写equals方法则会调用Object类的equals方法。

Object类的equals方法是用“”号进行比较,在很多时候,因为号比较的是两个对象的内存地址而不是实际的值,所以不是很符合业务要求。所以很多时候我们需要重写equals方法,去比较对象中每一个成员变量的值是否相等。

问题来了

重写equals()方法就可以比较两个对象是否相等,为什么还要重写hashcode()方法呢?

因为HashSet、HashMap底层在添加元素时,会先判断对象的hashCode是否相等,如果hashCode相等才会用equals()方法比较是否相等。换句话说,HashSet和HashMap在判断两个元素是否相等时,会先判断hashCode,如果两个对象的hashCode不同则必定不相等

下面我们做一个试验,有一个User类,只重写equals()方法,然后放到Set集合中去重。

public class User {
   

    private String id;

    private String name;

    private Integer age;
    
    public User(String id, String name, Integer age) {
   
        this
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值