1、== 和 equals 的区别?
==:如果⽐较的对象是基本数据类型,则⽐较的是数值是否相等;如果⽐较的是引⽤数据类型,则⽐较的是对象的地址值是否相等。
equals ⽅法:⽤来⽐较两个对象的内容是否相等。注意:equals ⽅法不能⽤于⽐较基本数据类型的变量。如果没 有对 equals ⽅法进⾏重写,则⽐较的是引⽤类型的变量所指向的对象的地址(很多类重新了 equals ⽅法,⽐如 String、Integer 等把它变成了值⽐较,所以⼀般情况下 equals ⽐较的是值是否相等)。
2、两个对象的 hashCode() 相同,则 equals() 也⼀定为 true 吗?
两个对象的 hashCode() 相同,equals() 不⼀定为 true。因为在散列表中,hashCode() 相等即两个键值对的哈希值相等,然⽽哈希值相等,并不⼀定能得出键值对相等【散列冲突】。
3、为什么重写 equals() 就⼀定要重写 hashCode() ⽅法?
这个问题应该是有个前提,就是你需要⽤到 HashMap、HashSet 等 Java 集合,⽤不到哈希表的话,其实仅仅重写 equals() ⽅法也可以。⽽⼯作中的场景是常常⽤到 Java 集合,所以 Java 官⽅建议重写 equals() 就⼀定要重写 hashCode() ⽅法。 对于对象集合的判断,如果⼀个集合含有 10000 个对象实例,仅仅使⽤ equals() ⽅法的话,那么对于⼀个对象判断就需要⽐较 10000 次,随着集合规模的增⼤,时间开销是很⼤的。但是同时使⽤哈希表的话,就能快速定位到 对象的⼤概存储位置,并且在定位到⼤概存储位置后,后续⽐较过程中,如果两个对象的 hashCode 不相同,也不 再需要调⽤ equals() ⽅法,从⽽⼤⼤减少了 equals() ⽐较次数。 所以从程序实现原理上来讲的话,既需要 equals() ⽅法,也需要 hashCode() ⽅法。那么既然重写了 equals(),那 么也要重写 hashCode() ⽅法,以保证两者之间的配合关系。
hashCode()与equals()的相关规定:
1、如果两个对象相等,则 hashCode ⼀定也是相同的;
2、两个对象相等,对两个对象分别调⽤ equals ⽅法都返回 true;
3、两个对象有相同的 hashCode 值,它们也不⼀定是相等的;
4、因此,equals ⽅法被覆盖过,则 hashCode ⽅法也必须被覆盖;
5、hashCode() 的默认⾏为是对堆上的对象产⽣独特值。如果没有᯿写 hashCode(),则该 class 的两个对象⽆论 如何都不会相等(即使这两个对象指向相同的数据)