在线客服
扫描二维码
下载博学谷APP
扫描二维码
关注博学谷微信公众号
Java基础面试题Object类中Hashcode 和 equals区别与联系是什么?equals Object 类中默认的实现方式是 : return this == obj 。那就是说,只有 this 和 obj 引用同一个对象,才会返回 true。Hashcode这个方法返回对象的散列码,返回值是 int 类型的散列码。

equals:
Object 类中默认的实现方式是 : return this == obj 。那就是说,只有 this 和 obj 引用同一个对象,才会返回 true。
而我们往往需要用 equals 来判断 2 个对象是否等价,而非验证他们的唯一性。这样我们在实现自己的类时,就要重写equals
按照约定,equals 要满足以下规则。
自反性: x.equals(x) 一定是 true
对 null: x.equals(null) 一定是 false
对称性: x.equals(y) 和 y.equals(x)结果一致
传递性: a 和 b equals , b 和 c equals,那么 a 和 c也一定 equals。
一致性: 在某个运行时期间,2 个对象的状态的改变不会影响 equals 的决策结果,那么,在这个运行时期间,无论调用多少次 equals,都返回相同的结果。
Hashcode:
这个方法返回对象的散列码,返回值是 int 类型的散列码。
对象的散列码是为了更好的支持基于哈希机制的 Java 集合类,
例如 Hashtable, HashMap, HashSet 等。
关于 hashCode 方法,一致的约定是:
重写了 euqls 方法的对象必须同时重写 hashCode()方法。
如果 2 个对象通过 equals 调用后返回是 true,那么这个 2 对象的 hashCode 方法也必须返回同样的 int 型散列码
如果 2 个对象通过 equals 返回 false,他们的 hashCode 返回的值允许相同。(然而,程序员必须意识到,hashCode 返回一无二的散列码,会让存储这个对象的 hashtables 更好地作。)
在上面的例子中,Test 类对象有 2 个字段,num 和 data,这 2个字段代表了对象的状态,他们也用在 equals 方法中作为评判的依据。那么, 在 hashCode 方法中,这 2 个字段也要参与hash 值的运算,作为 hash 运算的中间参数。这点很关键,这是为了遵守:2 个对象 equals,那么 hashCode 一定相同规则。
也是说,参与 equals 函数的字段,也必须都参与 hashCode 的计算。
合乎情理的是:同一个类中的不同对象返回不同的散列码。典型的方式就是根据对象的地址来转换为此对象的散列码,但是这种方式对于 Java 来说并不是唯一的要求的的实现方式。通常也不是最好的实现方式。
相比 于 equals 公认实现约定,hashCode 的公约要求是很容易理解的。有 2 个重点是 hashCode 方法必须遵守的。约定的第 3点,其实就是第 2 点的细化,下面我们就来看看对 hashCode 方法的一致约定要求。
第一:在某个运行时期间,只要对象的(字段的)变化不会影响 equals 方法的决策结果,那么,在这个期间,无论调用多少次 hashCode,都必须返回同一个散列码。
第二:通过 equals 调用返回 true 的 2 个对象的 hashCode 一定一样。
第三:通过 equasl 返回 false 的 2 个对象的散列码不需要不同,也就是他们的 hashCode 方法的返回值允许出现相同的情况。
总结一句话:等价的(调用 equals 返回 true)对象必须产生相同的散列码。不等价的对象,不要求产生的散列码不相同。
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
Java开发Overload 和 Override 的区别是什么?
Java开发Overload 和 Override 的区别是什么?Overloaded 的方法是否可以改变返回值的类型?Overload 是重载的意思,Override 是覆盖的意思,也就是重写。重载 Overload 表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。
11007
2019-05-24 15:22:03
你所了解的数据库优化都有哪些?
数据库其实就是电子化的文件柜,用于储存数据,同时用户可以对数据进行增删改查等操作。在企业应用中,数据库非常重要,所以程序员在面试的时候,经常被提问关于数据库的问题。那当面试官问到你所了解的数据库优化都有哪些,你应该如何回答呢?
14027
2019-08-14 10:19:49
Java基础语法之注解学习笔记
在学习Java基础语法的时候,初学者常常会分不清注解与注释的区别。其实注解和注释是完全不一样的两个概念。简单来讲,注释就是方便自己或他人阅读代码,对编程思路或程序作用的解释说明。而注解则是代码里的特殊标记,是给编译器阅读的元数据。本文将为大家详细讲解一下Java基础语法中有关注解的相关知识点,需要学习的小伙伴可以跟着文章一起来梳理一遍知识点。
6660
2020-01-06 16:53:17
Java学完面向对象可以干什么?
面向对象是软件开发方法一种编程范式。面向对象是Java学习中的一个基础部分,学学面向对象逐步建立起面向对象编程思想,从会使用对象,到内存分析,再到理解为什么封装对象。想成为一名程序员只掌握面向对象的知识是远远不够的。
6852
2020-12-23 10:02:11
Redis相关常见面试题有哪些?
作为一名Java程序面试过程中会被问到Redis相关的问题,这里对其常见问题做了梳理。Redis是一个使用C语言编写的开源高性能非关系型的键值对数据库。Redis可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。
5774
2021-03-16 14:50:12
