Object.hashCode()与Object.equals()

【README】

本文旨在po出 hashCode , equals的api描述,以加深理解;

本文翻译自 jdk 文档;


【1】Object.hashCode()

1)介绍:返回对象的哈希码值。支持此方法是为了有利于哈希表,例如由 java.util.HashMap 提供的哈希表。

在 Java 应用程序执行期间,只要在同一个对象上多次调用它,hashCode 方法必须始终返回相同的整数,前提是对象上的 equals 比较中使用的信息没有被修改。该整数不需要从应用程序的一次执行到同一应用程序的另一次执行保持一致。

hashCode方法需要遵守的约定:如果根据 equals(Object) 方法两个对象相等,则对两个对象中的每一个调用 hashCode 方法必须产生相同的整数结果(*干货)

如果根据 equals(Object) 方法两个对象不相等,则不需要对这两个对象中的每一个调用 hashCode 方法必须产生不同的整数结果。但是,程序员应该意识到为不相等的对象生成不同的整数结果可能会提高哈希表的性能。

尽可能实用,类 Object 定义的 hashCode 方法确实为不同的对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但 Java™ 编程语言不需要这种实现技术。)

补充: 可以看下 equals(), System.identityHashCode()


【1.1】String.hashCode()

返回此字符串的哈希码。 String 对象的哈希码计算如下
        s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]       
使用 int 算术,其中 s[i] 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。 (空字符串的哈希值为零。)
返回:此对象的哈希码值。

private final char value[]; // 只能被一次赋值,不可二次修改public int hashCode() {int h = hash;if (h == 0 && value.length > 0) {char val[] = value;for (int i = 0; i < value.length; i++) {h = 31 * h + val[i];}hash = h;}return h;}

字符串底层是字符数组存储的,以字符串 aaa为例,存储结构为 ['a', 'a', 'a'] ,字符a的 ASCII 为97,则hash值计算步骤如下:

i 取值 0, 1, 2;初始时, h=hash=0;

ival[i]h
09797
19731*97+97 => 3104
29731*3104+97=> 96321    

所以字符串 aaa的hash值等于  96321 。

我们令 vi = val[i],则以后如下规则:

h0 = v0;

h1=31*v0+v1;

h2=31* [31*v0 + v1] + v2;

...

通过归纳法,我们可以得出字符串的hash值的计算公式为:

hn = 31^n * v0 + 31^n-1 * v1 + ...... + 31 * vn-1 + 31^0 * vn;  其中,vn表示字符串的第n个字符,n从0开始;

所以 字符串 "aaa" 的hash值 h2 = 31^2 * 97 + 31 * 97 + 97 = 96321 ;


【2】Object.equals ()

1)介绍:指示其他某个对象是否“等于”这个对象。
2)equals 方法在非空对象引用上实现等价关系:

  • 它是自反的:对于任何非空引用值 x,x.equals(x) 应该返回 true。
  • 它是对称的:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
  • 它是可传递的:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true 并且 y.equals(z) 返回 true,那么 x.equals(z) 应该返回 true。
  • 它是一致的:对于任何非空引用值 x 和 y,x.equals(y) 的多次调用始终返回 true 或始终返回 false,前提是对象的 equals 比较中使用的信息没有被修改。

对于任何非空引用值 x,x.equals(null) 应返回 false

Object 类的 equals 方法实现了对象上最有区别的可能等价关系;也就是说,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象(x == y 的值为 true)时,此方法才返回 true

请注意每当重写此方法时,通常都需要重写 hashCode 方法,以维护 hashCode 方法的一般约定,即相等的对象必须具有相等的哈希码

补充:也可以看看: hashCode(), java.util.HashMap


【3】System.identityHashCode(Object x)

1)介绍:为给定对象返回与默认方法 hashCode() 返回的相同的哈希码,无论给定对象的类是否覆盖 hashCode()。 空引用的哈希码为零


【4】HashMap.hash(Object key) 

 static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}

计算 key.hashCode() 并将散列的较高位(异或)传播到较低位。

由于该表使用二次幂掩码,因此仅在当前掩码之上位变化的散列集将始终发生冲突。 (众所周知的例子是在小表中保存连续整数的浮点键集。)

因此,我们应用了一种将较高位的影响向下传播的变换。 位扩展的速度、效用和质量之间存在权衡。 因为许多常见的哈希集已经合理分布(因此不会从传播中受益),并且因为我们使用树来处理 bin 中的大量冲突,所以我们只是以最便宜的方式对一些移位的位进行异或以减少系统损失, 以及合并最高位的影响,否则由于表边界而永远不会在索引计算中使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330025.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

for in for of区别_(for…in) VS (for…of)

这篇文章应该是在一年多之前读过的&#xff0c;那会看完感觉作者文采不错&#xff0c;就做了收藏&#xff0c;做此分享&#xff0c;希望能帮助到你更好的理解js中的循环~~~以下正文。。。今天可是个好日子&#xff01;你问我为什么&#xff1f;你这都不知道&#xff0c;ChinaJo…

Innodb中的事务隔离级别和锁的关系

前言 我们都知道事务的几种性质&#xff0c;数据库为了维护这些性质&#xff0c;尤其是一致性和隔离性&#xff0c;一般使用加锁这种方式。同时数据库又是个高并发的应用&#xff0c;同一时间会有大量的并发访问&#xff0c;如果加锁过度&#xff0c;会极大的降低并发处理能力…

并发队列-无界非阻塞队列 ConcurrentLinkedQueue 原理探究

转载自 并发队列-无界非阻塞队列 ConcurrentLinkedQueue 原理探究一、 前言 常用的并发队列有阻塞队列和非阻塞队列&#xff0c;前者使用锁实现&#xff0c;后者则使用CAS非阻塞算法实现&#xff0c;使用非阻塞队列一般性能比较好&#xff0c;下面就看看常用的非阻塞Concurrent…

(转)如何保障微服务架构下的数据一致性?

转自&#xff1a; https://cloud.tencent.com/developer/article/1459734 【1】写在前面 随着微服务架构的推广&#xff0c;越来越多的公司采用微服务架构来构建自己的业务平台。就像前边的文章说的&#xff0c;微服务架构为业务开发带来了诸多好处的同时&#xff0c;例如单一…

python中math库_Python的math库、random库实际应用

昨天在说那个列表的时候&#xff0c;我挖了一个坑&#xff0c;不知道你们看出来没有&#xff1f;就是用循环语句写迭代的时候&#xff0c;总是运行不了结果&#xff0c;其实是因为我没有缩进的问题&#xff0c;因为有一个for循环&#xff0c;下面print如果没有对应的缩进&#…

(转)漫画:什么是分布式事务?

转自&#xff1a; https://blog.csdn.net/bjweimengshu/article/details/79607522 假如没有分布式事务 在一系列微服务系统当中&#xff0c;假如不存在分布式事务&#xff0c;会发生什么呢&#xff1f;让我们以互联网中常用的交易业务为例子&#xff1a; 上图中包含了库存和订…

Java 线程池框架核心代码分析

转载自 Java 线程池框架核心代码分析前言 多线程编程中&#xff0c;为每个任务分配一个线程是不现实的&#xff0c;线程创建的开销和资源消耗都是很高的。线程池应运而生&#xff0c;成为我们管理线程的利器。Java 通过Executor接口&#xff0c;提供了一种标准的方法将任务的提…

python渐变色代码_如何在Python中创建颜色渐变?

6 个答案: 答案 0 :(得分&#xff1a;54) 我还没有看到一个简单的答案就是使用colour package。 通过pip安装 pip install colour 如此使用&#xff1a; from colour import Color red Color("red") colors list(red.range_to(Color("green"),10)) # col…

(转)web.xml 中的listener、 filter、servlet 加载顺序及其详解

转&#xff1a; https://www.cnblogs.com/Jeely/p/10762152.html web.xml 中的listener、 filter、servlet 加载顺序及其详解 一、概述 1、启动一个WEB项目的时候&#xff0c;WEB容器会去读取它的配置文件web.xml&#xff0c;读取<listener>和<context-param>两个…

柱状图python_python柱状图一行

编写计算柱状图的python程序有很多种方法。 通过柱状图,我指的是一个计算对象在 iterable 并在字典中输出计数。例如: >>> L abracadabra >>> histogram(L) {a: 5, b: 2, c: 1, d: 1, r: 2} 编写此函数的一种方法是: def histogram(L): d {} for x in L: i…

HashMap 和 HashTable 到底哪不同 ?

转载自 HashMap 和 HashTable 到底哪不同 &#xff1f;代码版本 JDK每一版本都在改进。本文讨论的HashMap和HashTable基于JDK 1.7.0_67。源码见这里 1. 时间 HashTable产生于JDK 1.1&#xff0c;而HashMap产生于JDK 1.2。从时间的维度上来看&#xff0c;HashMap要比HashTable出…

架构师成长之路(内附推荐书籍)

转&#xff1a; https://www.jianshu.com/p/f661f098b88a 想要成为架构师&#xff0c;对技术的深度和广度都有很高的要求&#xff0c;本文列举出成为一个架构师必备的技能和学习路线。 对于学习途径有疑惑或苦恼&#xff0c;或者有优秀资料可以提供的同学&#xff0c;可加留言&…

python 虚拟环境_理解Python虚拟环境

什么是环境既然有所谓的 虚拟环境&#xff08;Virtual Environment&#xff09;&#xff0c;那么首先有必要解释一下&#xff0c;什么是环境。这里的环境&#xff0c;指的就是 Python 代码的运行环境。它应该包含以下信息&#xff1a;Python 解释器&#xff0c;用哪个解释器来执…

java.util.concurrent.locks.Lock文档说明

【1】Lock接口文档描述 1.相比于使用synchronized方法和代码块&#xff0c;锁的出现提供了更广泛的锁操作。 锁允许更灵活的代码结构&#xff0c;具有许多不同的属性&#xff0c;还支持多个关联的Condition条件对象。 2.锁是用于控制多个线程访问共享资源的工具。通常&#…

20 个使用 Java CompletableFuture的例子

转载自 20 个使用 Java CompletableFuture的例子这篇文章介绍 Java 8 的 CompletionStage API和它的标准库的实现 CompletableFuture。API通过例子的方式演示了它的行为&#xff0c;每个例子演示一到两个行为。既然CompletableFuture类实现了CompletionStage接口&#xff0c;首…

fastreport 打印两个list_Smaller And Smarter Python数据结构:合并两个有序链表

原创&#xff1a; 老表 简说Python 今日问题 &#xff1a;翻转链表k个相邻结点"""目标&#xff1a;写一段程序&#xff0c;合并两个有序链表例如&#xff1a;输入-> 1->2->3输入-> 2->5->6->8输出-> 1->2->2->3->5->6-&…

java.util.concurrent.locks.Condition文档说明

【1】Condition接口文档描述 1.Condition类把Object监视器方法&#xff08;wait,nofify, notifyAll&#xff09;分解为不同对象&#xff0c;通过与Lock实现类的合并使用&#xff0c;Condition可以产生每个object都有多个等待集的效果。在Lock实现类替代synchronized方法或语句…

谈谈HashMap线程不安全的体现

转载自 谈谈HashMap线程不安全的体现HashMap的原理以及如何实现&#xff0c;之前在JDK7与JDK8中HashMap的实现中已经说明了。那么&#xff0c;为什么说HashMap是线程不安全的呢&#xff1f;它在多线程环境下&#xff0c;会发生什么情况呢&#xff1f;1. resize死循环我们都知道…

手机打开python文件_使用python在计算机和手机之间通过wifi进行简单的文件传输...

我会使用 paramiko.它安全快速而且非常简单.怎么回事&#xff1f; 所以我们首先导入模块,然后指定日志文件&#xff1a; import paramiko paramiko.util.log_to_file(/tmp/paramiko.log) 我们打开一个SSH传输&#xff1a; host "example.com" port 22 transport p…

10人以下小团队管理手册-学习笔记

【README】 本文总结于《10人以下小团队管理手册》&#xff0c;很nice的一本书&#xff0c;有兴趣的同学可以翻下&#xff1b; 【0】序章 作者作为咨询师发现&#xff0c; 1.下属对主管有不满&#xff0c;主管对下属有怨言&#xff1b; 2.10人以下小团队主管经常会为 如何用…