浅谈重不重写equals和hashcode对于HashMap添加元素的影响


只针对键是自定义类型的情况

1.不重写hashcode与equals方法

public class Dog {
    private String name;
    private Integer old;

    public Dog(String name, Integer old) {
        this.name = name;
        this.old = old;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", old=" + old +
                '}';
    }
    public static void main(String[] args) {
        Dog dog1 = new Dog("haha", 2);
        Dog dog2 = new Dog("haha2", 22);
        Dog dog3 = new Dog("haha2", 22);
        Map<Dog, String> dogStringHashMap = new HashMap<>();
        dogStringHashMap.put(dog1, "1");
        dogStringHashMap.put(dog2, "2");
        dogStringHashMap.put(dog3, "3");
        for(Map.Entry<Dog, String> entry:dogStringHashMap.entrySet()){
            System.out.println(entry.getKey().toString()+entry.getValue().toString());
        }
        System.out.println("---------------");
        System.out.println(dogStringHashMap.get(new Dog("haha2", 22)));
    }
}

在这里插入图片描述
如果没有重写这两个函数,那么相同的键是可以加入的,hashmap本质上是通过内存地址进行区分是否相同,所以最后get出名字为haha2年龄为22的狗时为null,因为这是个new出来的新对象,即使值一样,但是它有新的内存地址

2.重写 equals 不重写hashcode

情况与1一样
因为加入hashmap的时候,hashmap会先对key做hash,如果key的hash值已经存在于hashmap里,则再对有相同hash值的key进行equals比对,看看值是否相等,没有重写的hashcode,native函数一般是通过将该对象的内部地址转换成一个整数,所以不同的内存地址一般会生成不同的值

3.不重写 equals 重写hashcode

情况与1一样
不重写equals方法,native的equals方法是比较的内存地址,与==是一样的,就算重写了hashcode,hashcode相等的时候也会进行equals对比,结果肯定是不等的

4.重写 equals 重写hashcode

    @Override
    public boolean equals(Object obj) {
        if(this.name.equals(name)){
            return true;
        }
        return false;
    }

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

这里我是用名字来作为标识
在这里插入图片描述
所以dog3就把dog2覆盖掉了,因为他们的名字是一样的
最后取出name为haha2,年龄为22的value的时候也是根据名字取出了dog3的value,为3

所以重写 hashcode 方法是为了让我们能够正常使用 HashMap 等集合类,因为 HashMap 判断对象是否相等既要比较 hashcode 又要使用 equals 比较。先用hashcode过滤一遍是为了提高 HashMap 的效率.

当我们重写一个类的 equals 方法时就应当连同重写 hashcode 方法,并且两个方法应满足:
1)一致性,即:当两个对象 equals 比较为 true,那么 hashcode 值应当相等,当两个对象hashcode 值相等,但是 equals不一定相等

2)成对重写,即重写 equals 就应当重写 hashcode。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值