如何生成一个合适的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()的作用仅限于对象在内存中的...