谈谈自己对于hashcode和equals的理解

本文探讨了Java中hashCode和equals方法的关系,通过实例解释了为何当两个对象equals相等时,它们的hashCode必须相同。作者用住户入住大楼的比喻来说明hash算法和hash表的工作原理,并通过代码示例展示了字符串常量池在对象创建时的影响,指出不同创建方式对equals和hashCode结果的差异。
摘要由CSDN通过智能技术生成

一直以来,对于hashcode都只停留在知道的层面。只知道机械性的背诵:
可能hashcode相同但是equals不相同,不过equals相同hashcode一定相同。
重写equals一定重写hashcode。
今天再去学习的时候,突然有了自己新的理解,在这里记录一下。
首先,hash是一种算法,而hashcode就是通过这种算法算出的值,有一个对应的表叫做hash表。
举个例子,就是有懂大楼叫做hash表,每个对象就是不同的住户,而hashcode就是大楼的楼层,也就是对应的hash表中的值。
当有一个对象要进行存储,也就是有新住户要入住,首先通过hash算法计算出他要入住哪层楼,也就是算出他的hashcode,然后去看那一层楼里他是不是已经入住过了,也就是比较值是否相同,如果没有相同的,那他就顺利入住了。
然后回到上面的那两句话,首先是第一句。有了上面的例子就很好理解了。hashcode一样只能征明你们住在同一层,不能征明你们就是同一个人。但是equals代表你们是同一个人,那么你们肯定住在同一楼里面。
至于重写也很好理解,就是说你搬家了,不管是不是还在同一栋楼里,物业都会对你的住址进行重新登记。

写到这里我想起了一个很有趣的例子。
代码是这样的:

String a = "name";
String b = "name";
System.out.println(a.equals(b));
System.out.println(a==b);
System.out.println(a.hashCode());
System.out.println(b.hashCode());

运行结果如下:
在这里插入图片描述
将代码稍微修改一下:

String c = new String("111");
String d = new String("111");
System.out.println(c==d);
System.out.println(c.equals(d));
System.out.println(c.hashCode());
System.out.println(d.hashCode());

运行结果如下:
在这里插入图片描述
从中很明显的可以看到,当两个对象的equals是为true的时候,他们的hashcode一定是一样的,不管是用何种方式创建的。唯一的区别在两个对象的比较上。
第一种之所以为true,是因为"name"是一个字符串,他被直接在常量池中创建,当创建b这个对象的时候,因为常量池中已经有"name"了,所以就不再创建,直接引用了,所以a和b都是引用的常量池中的"name",所以是true。
但是第二种情况就不一样了,c和d都是通过new String()创建的对象,他们是两个值一样的对象,所以为false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值