每天一个知识点(五)两个对象的 hashCode()相同,则 equals()也一定为 true吗?

简介: 两个对象的 hashCode()相同,则 equals()也一定为 true吗?

微信搜索《Java鱼仔》,每天一个知识点不错过


(一)每天一个知识点


两个对象的 hashCode()相同,则 equals()也一定为 true吗?


(二)结论


这是一道很常见并且很简单的面试题,这道题的结论:


两个对象的hashCode()相同,equals()不一定为true;


两个对象的equals为true,则两个对象的hashcode一定为true;


(三)再多学一点


首先我们来了解一下hashCode()方法是干什么的,hashCode的存在主要是用于查找的快捷,比如我们常用的HashMap等集合,hashCode用来在散列的存储结构中确定对象的存储地址。


java中所有的对象都有一个父类Object,而Object有一个hashCode方法,Java的所有类都有hashcode方法。


我们来看看hashcode的计算方法:


for (Objectelement : a)
result=31*result+ (element==null?0 : element.hashCode());

hashcode其实就是对一个对象中的每个元素进行一次运算生成的结果值,两个不同的对象是有可能出现同一个hash值的。


比如下面两个字符串:


Strings1="Ma";
Strings2="NB";
System.out.println(s1.hashCode()==s2.hashCode());  //trueSystem.out.println(s1.equals(s2));  //false

虽然两个Ma和NB两个字符串不同,但是他们有相同的hashcode值2484。


创建实体类的时候如果要使用hashCode方法或equals方法时需要在实体类中重写:

@Overridepublicbooleanequals(Objecto) {
if (this==o) returntrue;
if (o==null||getClass() !=o.getClass()) returnfalse;
Useruser= (User) o;
returnObjects.equals(name, user.name) &&Objects.equals(age, user.age);
}
@OverridepublicinthashCode() {
returnObjects.hash(name, age);
}

同理,实体对象同样存在两个不同对象存在同一个hash值的情况。

相关文章
|
6天前
|
Java
hashCode()和 equals()方法的默认实现
在Java中,`hashCode()` 和 `equals()` 方法的默认实现由 `Object` 类提供。`equals()` 默认比较对象引用是否相同,`hashCode()` 则返回对象的内存地址的整数表示。为了确保哈希表等数据结构的正确性,当重写 `equals()` 时,通常也需要重写 `hashCode()`。
|
6天前
|
存储 Java
两个对象的 hashCode()相同,则 equals()
当两个对象的 `hashCode()` 方法返回值相同时,这两个对象的 `equals()` 方法不一定返回 `true`。`hashCode()` 相同仅表示两对象可能相等,需进一步通过 `equals()` 方法验证对象是否真正相等。
|
4月前
|
Java 容器
equals与hashcode的区别与联系
equals与hashcode的区别与联系
|
存储 算法 Java
Java 中的 == 运算符、equals 方法和 hashCode 方法
HashMap 中键是不可以重复的,因此它的键就必须是不同的对象,那么这个时候就先用计算速度快的 hashCode 进行比较,若哈希值都不相等,那么这两个对象必然不相等,若是相等的,那么这个就有两种可能出现,一种情况是这两个对象是真的相等,另外一种情况就是出现了罕见的“哈希冲突”现象,那么这个时候就轮到 equals 来进行判断了!在 HashMap 中,键是不可以重复的,也就是说,它们的键都是不相同的,因此就要判断不同对象是否为同一对象。因此,哈希值可以用于判断两个对象是否不等。
101 1
|
算法 Java 索引
equals方法和hashCode方法之间的那些事(1.1)
equals方法和hashCode方法之间的那些事(1.1)
|
Java
Java 最常见的面试题:两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
344 0
|
存储 Java
详解“==”和equals的区别
“==”和equals 最大的区别是 “==”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。 equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值。
|
存储 Java
“==”和equals 最大的区别
“==”和equals 最大的区别是 “==”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。 equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值。
|
存储
"=="和 equals 方法究竟有什么区别?
"=="和 equals 方法究竟有什么区别?
127 0
|
算法 安全 Java
@EqualsAndHashCode - 相等更简单:从对象的字段生成hashCode和equals实现
@EqualsAndHashCode - 相等更简单:从对象的字段生成hashCode和equals实现