新挑战驱魔,澳元汇率走势,安蕾丝照片
首先提出这样一个问题:
如果两个对象不相同,他们的hashcode值一定不相等吗?
我们都知道equals和hashcode是object中的方法,java中每一个对象都具有这两个方法。
public boolean equals(object obj) { return (this == obj); }
public native int hashcode();
再来看两条关于这两个方法的规范:
当然,上述只是规范。针对规范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,又会是怎样的结果。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对移动技术网的支持。如果你想了解更多相关内容请查看下面相关链接
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
浅析我对 String、StringBuilder、StringBuffer 的理解
使用IDEA搭建SSM框架的详细教程(spring + springMVC +MyBatis)
Springboot整合freemarker 404问题解决方案
引入mybatis-plus报 Invalid bound statement错误问题的解决方法
网友评论