关于equals和hashCode的执行顺序

本文通过测试代码展示了在使用HashMap时,equals和hashCode方法的调用顺序。当调用`put()`和`containsKey()`时,HashMap首先根据hashCode定位元素,然后使用equals进行精确匹配。对于`containsKey()`, 如果hashCode相同但equals不同,不会执行equals。理解这个过程对于优化哈希表性能至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于equals和hashCode的执行顺序的一些测试结果

先附上一些测试代码

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

public class Test {

    private String name;
    private int age;
    private int num;

    public Test(String name, int age, int num) {
        this.name = name;
        this.age = age;
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Test test = (Test) o;
        return age == test.age &&
                num == test.num &&
                Objects.equals(name, test.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age, num);
    }

    public static void main(String[] args) {
        Map<Test, String> map = new HashMap<>();

        Test myTest1 = new Test("张三", 10, 1);
        Test myTest2 = new Test("张三", 10, 1);
        Test myTest3 = new Test("李四", 10, 1);
        map.put(myTest1, "1");
        System.out.println(map.containsKey(myTest1));
        System.out.println(map.containsKey(myTest2));
        System.out.println(map.containsKey(myTest3));
    }
}

1 当调用map.put()方法时,会对key进行hash运算(具体可以看HashMap底层),这里调用了一次hashCode方法
2 当调用map.containsKey(myTest1)时,只调用了一次hashCode方法,没有调用equals方法(原因未知,猜测可能在底层做过了==进行地址判断,有知道的大牛请多指教)
3 当调用map.containsKey(myTest2)时,先调用了hashCode方法,相等,则继续调用equals方法
4 当调用map.containsKey(myTest3)时,先调用了hashCode方法,不等,不继续调用equals方法

equals判等的方式和hashCode判等的方式请自行搜索

总结:当调用containsKey时,会首先调用hashCode方法做初步判定,如果通过(不同的key可能算出来的结果相同!!!HashMap散列表的数组索引就是hash算法生成的,高16位^低16位 & 散列表的长度-1),继续调用equals方法判定,如果还是通过,就认定是相同的了。当然,要不要等还是看你这两个方法怎么实现

其实如果看过hashMap底层,可以发现,放key时,先通过hash算法找到散列表数组索引位置,然后遍历链表/红黑树,用equals判断是不是同一个key

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值