时间:2021-05-19
首先提出这样一个问题:
如果两个对象不相同,他们的hashCode值一定不相等吗?
我们都知道equals和hashCode是Object中的方法,java中每一个对象都具有这两个方法。
再来看两条关于这两个方法的规范:
当然,上述只是规范。针对规范1,如果重写equals(Object obj)返回true,而hashCode()方法返回不相等的值,也是可以编译过的。
这样我们可以作出如下推论:
看着有点绕,其实原理很简单。我们从推论3和推论4可以预测:
Java在判断两个对象是否“相同”时,首先判断他们的hashCode()方法是否返回相等的int值,其次判断equals方法是否返回true。
我们可以写一段简单的代码测试一下:
首先写一个Java类:
public class Person { //重写equals方法,始终返回false; @Override public boolean equals(Object obj) { System.out.println("判断Person的equals"); return false; } //重写hashCode方法,始终返回1; @Override public int hashCode() { System.out.println("判断Person的hashCode"); return 1; }}上述代码中Person类重写了equals方法,打印并始终返回false,重写了hashCode方法,打印并始终返回1。
我们都知道Map中要求键不能重复,也就是不能“相同”,所以可以写如下的测试类:
public class TestPerson { @Test public void test(){ Map<Person,Object> map = new HashMap<>(); map.put(new Person(),new Object());//放入第1个Person-Object键值对; System.out.println("====================="); map.put(new Person(),new Object());//放入第2个Person-Object键值对; System.out.println(map.size()); }}运行,打印结果如下
判断Person的hashCode
=====================
判断Person的hashCode
判断Person的equals
2
我们来分析一下:
所以可以得出结论:
Java在判断两个对象是否“相同”时,首先判断他们的hashCode()方法是否返回相等的int值,如果不相等则直接认为他们不“相同”,如果相等,再判断equals方法是否返回true。
针对上述代码,可以在equals方法和hashCode方法中分别打断点,Debug运行,这样会看得比较清楚一点。
我们回到最初的那个问题:如果两个对象不相同,他们的hashCode值一定不相等吗?
上述代码中的场景就充分说明两个对象不相同时hashCode值却相等的场景,当然,这是不按照规范操作的情况。所以写代码时一定要按照规范要求的去做,避免不必要的BUG
可以试想一下,如果将上述代码中重写equals方法中的始终返回false改为始终返回true,又会是怎样的结果。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这两个方法,今天就来
Java中==运算符与equals方法的区别及intern方法详解1.==运算符与equals()方法2.hashCode()方法的应用3.intern()方法
初步探索首先我们要了解equals方法是什么,hashcode方法是什么。equals方法equals是java的obejct类的一个方法,equals的源码如
我们都知道Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类。其equals方法比较的是两个对象的引用指向的地址,hashcode是
在java中,有一个这样的规定,就是两个相同的对象(即equals运算为true),它们的hashcode也必须相同。在Object类中有一个hashCode方