问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何生成一个合适的hashcode方法

发布网友 发布时间:2022-04-23 02:47

我来回答

1个回答

热心网友 时间:2022-05-01 20:50

Hashcode在基于key-value的集合如:HashMap、LinkedHashMap中扮演很重要的角色。此外在HashSet集合中也会运用到,使用合适的hashcode方法在检索操作时的时间复杂度最好的是 O(1).
一个差劲的hashcode算法不仅会降低基于哈希集合的性能,而且会导致异常结果。Java应用中有多种不同的方式来生成hashcode。
Effective Java
Josh Bloch在他的书籍《Effective Java》告诉我们重写hashcode方法的最佳实践方式。
一个好的hashcode方法通常最好是不相等的对象产生不相等的hash值,理想情况下,hashcode方法应该把集合中不相等的实例均匀分布到所有可能的hash值上面。
把某个非0的常数值,比如17,保存在一个名为result的int类型的变量中。
对于对象中的每个域,做如下操作:
为该域计算int类型的哈希值c:
如果该域是boolean类型,则计算(f?1:0)
如果该域是byte、char、short或者int类型,则计算(int)f
如果该域是long类型,则计算(int)(f^(f>>>32))
如果该域是float类型,则计算Float.floatToIntBits(f)
如果该域是double类型,则计算Double.doubleToLongBits(f),然后重复第三个步骤。
如果该域是一个对象引用,并且该类的equals方法通过递归调用equals方法来比较这个域,同样为这个域递归的调用hashCode,如果这个域为null,则返回0。
如果该域是数组,则要把每一个元素当作单独的域来处理,递归的运用上述规则,如果数组域中的每个元素都很重要,那么可以使用Arrays.hashCode方法。
把上面计算得到的hash值c合并到result中
result = 31*result + c
String中的Hashcode方法
String的hashcode的算法就充分利用了字符串内部字符数组的所有字符。生成hash码的算法的在string类中看起来像如下所示,注意“s“是那个字符数组,n是字符串的长度。
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
Hashcode使用Eclipse IDE
现代IDE通过点击右键上下文菜单可以自动生成hashcode方法,通过Eclipse IDE 生成的hashcode像:
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + a;
return result;
}
但是并不推荐如上代码使用在企业级代码中,最好使用第三方库如Apache commons来生成hashocde方法。
Apache commons HashcodeBuilder
我们可以用Apache Commons hashcode builder来生成代码,使用这样一个第三方库的优势是可以反复验证尝试代码。下面代码显示了如何使用Apache Commons hash code 为一个自定义类构建生成hash code 。
public int hashCode(){
HashCodeBuilder builder = new HashCodeBuilder();
builder.append(mostSignificantMemberVariable);
........................
builder.append(leastSignificantMemberVariable);
return builder.toHashCode();
}
如上面代码显示的,最重要的签名成员变量应该首先传递然后跟随的是没那么重要的成员变量。
Apache Commons库同样为自定义的类提供了构建生成equals的方法,使用equals构建器的代码看起来非常像上面的代码。事实上传递给成员变量从最重要的签名到最不重要的签名一样的规则,同样应用于equals构建器中。
如何生成一个合适的hashcode方法

一个好的hashcode方法通常最好是不相等的对象产生不相等的hash值,理想情况下,hashcode方法应该把集合中不相等的实例均匀分布到所有可能的hash值上面。把某个非0的常数值,比如17,保存在一个名为result的int类型的变量中。对于对象中的每个域,做如下操作:如果该域是boolean类型,则计算(f?1:0)如果...

aippt自动生成工具

随着AI技术的飞速发展,如今市面上涌现了许多实用易操作的AI生成工具1、简介:AiPPT: 这款AI工具智能理解用户输入的主题,提供“AI智能生成”和“导入本地大纲”的选项,生成的PPT内容丰富多样,可自由编辑和添加元素,图表类型包括柱状图、条形...

如何生成一个合适的hashcode方法

一般来讲,equals这个方法是给用户调用的,如果你想判断2个对象是否相等,你可以重写equals方法,然后在代码中调用,就可以判断他们是否相等了。简单来讲,equals方法主要是用来判断从表面上看或者从内容上看,2个对象是不是相等。举个例子,有个学生类,属性只有姓名和性别,那么我们可以认为只要姓名和性别...

如何生成一个合适的hashcode方法

1.不同的字符串可能会有相同的HashCode吗?可以!2.相同的字符串可能会有不同的HashCode吗?如果你自己重写equals和hashcode方法是可以实现的,但是java规范要求两个equals的对象一定要有相同的hashcode3.相同的字符串每次生成的HashCode都相同吗?你的实现可以不同,但是java规范要求对于同一个对象每次生成...

如何生成一个合适的hashcode方法

String的hashcode的算法就充分利用了字符串内部字符数组的所有字符。生成hash码的算法的在string类中看起来像如下所示,注意“s“是那个字符数组,n是字符串的长度。

哈希码什么是哈希码(HashCode)

接下来,我们来看看几种常见的哈希码生成算法:Object类的hashCode方法,它返回的是对象内存地址经过处理后的结果。由于每个对象的内存地址独一无二,因此它们的哈希码也会不同。String类的hashCode,是基于字符串内容进行计算的。如果两个字符串的内容相同,它们的哈希码也会一致。Integer类的hashCode,返回...

hashCode 原理

策略 1:通过在启动参数中添加 `-XX:hashCode=4`,改变默认的 hashCode 计算方式。这是使用 Park-Miller 伪随机数生成器生成的随机数。 策略 2:将对象的内存地址进行移位运算后与一个随机数进行异或操作。 策略 3:返回固定的数字 1。 策略 4:返回当前对象的内存地址。 策略 5:返回...

equals()和hashCode()方法详解

equals()方法用于比较两个对象的内容或引用是否相等,主要用于对象间的比较。而hashCode()方法则生成一个整数哈希值,用于快速定位和比较对象在集合中的位置,如HashSet、HashMap等。设计这两个方法时,应遵循以下原则:1. 如果两个对象被认为是相等的(即通过equals()方法比较结果为true),那么它们的...

如何正确的重写equals 和 hashCode方法

hashCode()和equals()的用法 重写默认实现 使用Apache Commons Lang包重写hashCode()和equals()需要注意记住的事情 当使用ORM的时候特别要注意的 hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法。使用hashCode()和equals()hashCode()方法被用来获取给定...

GetHashCode()方法(C#)

一个对象的 GetHashCode 方法必须总是返回同一个哈希代码,但前提是没有修改过对象状态,对象状态用来确定对象的 Equals 方法的返回值。请注意,这仅适用于应用程序的当前执行,再次运行该应用程序时可能会返回另一个哈希代码。为了获得最佳性能,哈希函数必须为所有输入生成随机分布。

说说hashCode() 和 equals() 之间的关系?

hashCode()方法用于生成对象的哈希码,一个整数值,用于哈希表的索引定位。equals()方法则判断两个对象是否相等。两种情况下的hashCode()和equals()关系如下:1. 当对象不会用于散列表(如HashSet, HashMap, Hashtable)时,hashCode()和equals()没有直接关系。hashCode()的作用仅限于对象在内存中的...

object的hashcode hashcode和hash hashcode方法实现 excel2012生成hash值 hashcode的理解 Excel生成hash gethashcode js生成hash hashcode使用
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
锂电池3.7v和3.8v有什么区别呢? 从石岐百佳附近怎样乘车到五桂山逍遥谷? 保护板3.75V电压高吗?? 寝馈其中是什么意思怎么读 寝馈不安的意思 寝馈怎么读音是什么意思 《武林群侠传》流程攻略 《侠客风云传》各类内功心法效果一览介绍_《侠客风云传》各类内功心法效... 《侠客风云传》天王归来DLC玩法小提示介绍_《侠客风云传》天王归来DL... 武林群侠传中在逍遥谷练功在去拜寿怎么谁也打不过啊? 普洱茶的发明者 重写hashCode中为什么基本都是乘以31 如何正确实现Java中的hashCode方法 求普洱茶的由来。为什么叫普洱茶? Java中的HashCode问题 普洱历史,故事,传统,文化,好处 如何重写hashcode方法 关于hashcode的问题 普洱茶历史的介绍 问一个java中关于hashcode的问题 hash code是什么 hashCode重载时的疑问,prime为啥是31而不是其他 普洱茶历史的普洱茶的来由 为什么在定义hashcode时要使用31这个数 云南的“普洱茶”缘于什么? Java 重写hashCode 时为什么要用 31 来计算 有历史普洱茶的小故事? 普洱茶的历史是怎么样的? 普洱茶历史的历史渊源 靴子掉色正常吗 有谁知道云南彝族关于茶的故事,传说与渊源。谢谢麻烦各位 请问java中重写hashcode的作用 何时才要重写hashcode Java中HashSet类的hashCode方法如何重写,有什么作用? Java 中的hashcode到底是什么啊?怎样判断两个元素或者对象的hashcode是否就相同了 java中equals方法和hashcode方法的问题 HashCode有多大可能重复 java 求组合写hashCode的技巧 关于hashCode()的模拟代码 苹果手机怎么在日历上标记生日? iPhone在系统日历上怎么设置自己生日? 苹果日历怎么设置生日 苹果手机日历怎么添加生日 苹果怎么设置生日 如何让iphone的日历显示农历生日 苹果日历怎么添加生日 iphone怎么在日历中添加生日 苹果手机日历如何同步通讯录生日? 笔记本闪屏死机是什么原因 笔记本闪屏怎么处理? 笔记本屏幕闪屏怎么回事?