hashCode与equals的区别

时间:2022-04-24
本文章向大家介绍hashCode与equals的区别,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

hashCode与equals

HashSetHashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键。 那么Java运行时环境是如何判断HashSet 中相同对象、HashMap中相同键的呢?当存储了相同的东西之后Java运行时环境又将如何来维护呢? 在研究这个问题之前,首先说明一下JDKequals(Object obj)hashcode()这两个方法的定义和规范:在Java中任何一个对象都具备equals(Object obj)hashcode()这两个方法,因为他们是在Object类中定义的。equals(Object obj)方法用来判断两个对象是否“相同”,如果“相同”则返回true,否则返回falsehashcode()方法返回一个int数,在Object类中的默认实现是“将该对象的内部地址转换成一个整数返回”。

接下来有两个个关于这两个方法的重要规范:

  • 若重写equals(Object obj)方法,有必要重写hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值。 说得简单点就是: 如果两个对象相同,那么他们的hashcode应该相等。不过请注意:这个只是规范,如果你非要写一个类让equals(Object obj)返回truehashcode()返回两个不相等的值,编译和运行都是不会报错的。不过这样违反了Java规范,程序也就埋下了BUG
  • 如果equals(Object obj)返回false,即两个对象“不相同”,并不要求对这两个对象调用hashcode()方法得到两个不相同的数。 说的简单点就是:“如果两个对象不相同,他们的hashcode可能相同”。
  • 如果两个对象相同,那么它们的hashCode值一定要相同;
  • 如果两个对象的hashCode相同,它们并不一定相同 上面说的对象相同指的是用eqauls方法比较。 你当然可以不按要求去做了,但你会发现,相同的对象可以出现在Set集合中。同时,增加新元素的效率会大大下降。