(编程纯萌新Java学习收获--集合)对Hashcode和equals的理解

Object中的equals是通过比较两个对象的内存地址来判断其真假的而原始的Hashcode方法返回的是对象的内存地址由哈希算法转换成一个整数。那么当equals判断两个对象相等时,他们的hashcode一定也相等。

在Hashset集合方法中如果我们想实现以下操作

package com.kui.Set01;

import java.util.HashSet;

public class Hashset1 {
    public static void main(String[] args) {
        HashSet<man> iss = new HashSet<>();
        man s1 = new man("yuan");
        man s2 = new man("jia");
        man s3 = new man("po");
        iss.add(s1);
        iss.add(s2);
        iss.add(s3);
        iss.add(new man("yuan"));
        
    }
}

任务:我想让iss.add(new man("yuan"));里面的对象与我们的s1这个对象完全相等而使得让add方法认为其重复无法加入到集合当中

那么我们必须要重写Hashcode和equals这两个方法才能满足。

原因是因为当我们没有重写hashcode而只重写equals时,此时由于hashset是先通过判断两个对象的hashcode是否一样来规定你的数组存放位置进而执行去重操作,那么这里的hashcode显然是不一样的,因为我们没有重写hashcode,两个对象的内存地址不同,那么两个对象hashcode就不同。这时就有可能使你的这两个对象在数组中的存放位置不同。此时equals虽然判断两个对象相等但是hashset由于你存放的数组位置不同不会执行去重操作,然后直接一起加入进去。

同样的,当我们没有重写equals而只重写hashcode时,此时hashset先判断两个对象hashcode相等那么加入到数组同一位置再进行下一步判断,就是equals判断,这里equals判断绝对是不相等的然后就加入进去了。因为虽然你现在两个对象hashcode相等,但是我们equals是通过两个对象的内存地址来判断这两个对象是否相等的。你hashcode原来是通过对象的内存地址由哈希算法转换,所以你原来可能会误以为是equals用了hashcode这串数字来进行判断。现在重写的hashcode则是通过对象名字的哈希值来定。于是你发现判断不相等。也就是说你重写这个hashcode不会影响equals的判断,所以equals判断两个对象内存地址不相等就给他加入进去了。

得出结论,必须要重写Hashcode和equals这两个方法才能满足。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值