关于重写 equals 和 hashCode 方法对 Map.get() 方法影响的测试

未重写 hashCode 和 equals

public class ObjectDemo {
    static class MyClass {
        public String name;
    }

    public static void main(String[] args) {
        MyClass myClass1 = new MyClass();
        System.out.println(myClass1);

        System.out.println("============");
        Map<MyClass, String> map = new HashMap<>();
        map.put(myClass1, "123");
        System.out.println(map.get(myClass1));

        System.out.println("============");
        myClass1.name = "hello";
        System.out.println(myClass1);
        System.out.println(map.get(myClass1));
    }
}

这里写图片描述


重写 hashCode 和 equals

public class ObjectDemo {
    static class MyClass {
        public String name;

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            MyClass myClass = (MyClass) o;
            return Objects.equals(name, myClass.name);
        }

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

    public static void main(String[] args) {
        MyClass myClass1 = new MyClass();
        System.out.println(myClass1);

        System.out.println("============");
        Map<MyClass, String> map = new HashMap<>();
        map.put(myClass1, "123");
        System.out.println(map.get(myClass1));

        System.out.println("============");
        myClass1.name = "hello";
        System.out.println(myClass1);
        System.out.println(map.get(myClass1));
    }
}

这里写图片描述


结论:

Obejct 的 equals 方法的实现为 使用 == 运算符比较两个对象
当 == 用于比较两个对象时,实际比较的是 对象在方法区 中的地址

Object 的 hashCode 方法为 native 方法,只确定和 对象在堆中的地址有关,但不完全就是 堆中的地址

如果一个对象(未重写 hashCode 和 equals),即改变对象中的成员属性等不会使对象的 hashCode 改变,那么不影响 Map.get() 方法获取到的结果

如果一个对象(重写了 hashCode 和 equals),那么改变对象中的成员属性会导致对象的 hashCode 造成改变,那么 Map.get() 方法获取的结果将受到影响

说明
1、Map 的 get 方法会根据对象的 hashCode 计算出 hash 值,从而得到哈希桶的位置(Entry 数组下标的编号)

2、重写 equals 时必须重写 hashCode 方法,Java 规范中要求,equal 对象的 hashCode 必须相同(hashCode 相同,不一定 equal)


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值