`
coolerbaosi
  • 浏览: 767226 次
文章分类
社区版块
存档分类
最新评论

为什么在定义hashcode时要使用31这个数呢?

 
阅读更多

public int hashCode() {

int h = hash;
int len = count;
if (h == 0 && len > 0) {
int off = offset;
char val[] = value;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}

该函数是我看的函数接口源码,为什么要使用31这个数呢?

其实上面的实现也可以总结成数数里面下面这样的公式:

s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]

原因如下:

A.31是一个素数,素数作用就是如果我用一个数字来乘以这个素数,那么最终的出来的结果只能被素数本身和被乘数还有1来整除!。(减少冲突)

B.31可以 由i*31== (i<<5)-1来表示,现在很多虚拟机里面都有做相关优化.(提高算法效率)

C.选择系数的时候要选择尽量大的系数。因为如果计算出来的hash地址越大,所谓的“冲突”就越少,查找起来效率也会提高。(减少冲突)

D.并且31只占用5bits,相乘造成数据溢出的概率较小。

分享到:
评论

相关推荐

    定义hashcode时使用31系数的原因

    那么,为什么使用31作为系数呢?首先,31是一个质数,它的特性是只有1和自己是因子。这使得它和其他数相乘后得到的结果比其他方式更容易产成唯一性,也就是hash code值的冲突概率最小。其次,31*N可以被编译器优化为...

    HashCode的用法详解

    为什么需要重写 hashCode()?因为我们需要确保对象的唯一性。如果我们不重写 hashCode(),那么对象的 hashCode 将会默认使用 Object 类中的 hashCode 方法,这样将会导致对象的存储位置不确定。 例如,如果我们有两...

    Java理论与实践:hashCode()和equals()方法

    本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式...

    equals与hashCode方法讲解

    equals 方法和 hashCode 方法是 Java 语言中两个重要的方法,它们都是在 Object 类中定义的。equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java 的 Object 类中,equals 方法...

    Java中equals,hashcode和==的区别

    然而,如果我们定义两个 Integer 对象 integer1 和 integer2,并将它们赋值为 6,然后使用 == 号比较它们,结果将是 false。这是因为 integer1 和 integer2 是两个不同的对象,即使它们的值相同。 其次,equals ...

    equals与hashCode在实际开发中的重写写法

    `hashCode()` 的作用是为对象生成一个唯一的整数值,这个值通常被用来快速定位对象在哈希表(如 `HashSet` 或 `HashMap`)中的位置。`hashCode()` 的设计必须满足以下条件: 1. 相等的对象必须具有相同的哈希码:...

    hashcode使用方法

    当两个对象通过 `equals` 方法被判断为相等时,它们的 `hashCode` 必须也相等。但是,即使两个对象的 `hashCode` 相同,也不意味着它们一定相等。 #### 实现原理 1. **默认实现**:每个Java对象都有一个默认的 `...

    hashcode与eqault比较

    2. **避免返回固定值**:不要在`hashCode`方法中总是返回一个固定的值,比如0,这会导致所有的对象都映射到同一个哈希桶中,从而降低哈希表的性能。 3. **考虑效率**:在实现`hashCode`时,应该尽可能地让不同的对象...

    关于hashCode()和equals()的本质区别和联系

    本文将详细介绍 hashCode() 和 equals() 的本质区别和联系,并探讨在创建 Java 类时如何定义这些方法。 hashCode() 方法 hashCode() 方法是 Object 类中的一个方法,它返回对象的哈希码值。哈希码值是一个整数,它...

    equals,hashcode,toString

    在`DBObject.java`这个文件中,我们可以推测它可能定义了一个名为`DBObject`的类,该类可能代表某种数据库对象。在这个类中,很可能已经重写了`equals()`, `hashCode()` 和 `toString()` 方法,以便更好地处理对象的...

    PPT浅析hashcode

    PPT浅析hashcode定义和作用;和简单的代码演示PPT.很简单的

    java 序列化和重写 hashCode 的原因

    这两个方法在Java中的`Object`类中定义,但为了正确地比较对象并处理集合(如HashSet或HashMap)时,通常需要重写它们。`equals`方法用于比较两个对象是否相等,而`hashCode`方法返回对象的一个整数值,用于在哈希表...

    java中hashcode()和equals()方法详解

    在这个例子中,`equals()`方法基于`name`和`age`属性来判断两个`Person`对象是否相等,而`hashCode()`方法也考虑到了这两个属性,以确保当两个对象相等时,它们的哈希码也相同。 #### 总结 `hashCode()`和`equals()...

    JAVA_高级特性(hashCode,clone,比较器,Class反射,序列化)

    在示例中,`Person` 类实现了 `Serializable` 接口,并且 `age` 字段被标记为 `transient`,这意味着在序列化过程中不会保存 `age` 的值。 序列化的实现代码如下: ```java // 序列化 ObjectOutputStream oos = ...

    C#获得hashCode源码,可生成32位和64位,获得的结果不一样

    在C#编程语言中,`hashCode`是一个非常重要的概念,特别是在数据结构如哈希表(HashMap)中。`GetHashCode`方法是.NET框架中的一个关键组成部分,它为对象提供了一个整数值,这个值通常用于快速比较和定位对象。标题...

    Java中hashCode和equals方法的正确使用

     hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法。  使用hashCode()和equals()  hashCode()方法被用来获取给定对象的整数。这个整数被用来确定对象被...

    java中的哈希算法和hashcode深入讲解1

    * 要找到生成同一个哈希值的2个不同输入,在一定时间范围内,是不可能的 正因为哈希值的这些特点,使得哈希算法应用在加密领域成为可能。哈希算法在加密领域的应用,源于哈希算法的不可逆性,对于用户输入的密码,...

    comparing java objects_hashcode_Comparing_

    两个相等的对象(根据`equals()`方法定义)必须具有相同的哈希码,因为这保证了它们在哈希表中会被放在相同的位置。 `equals()`方法是另一个关键成员,它用于判断两个对象是否表示同一个实体。默认的`equals()`方法...

    深入理解Java中HashCode方法

    hashCode方法的实现方式有多种,String类的hashCode方法就是一个典型的例子,它使用数学表达式s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]来计算hashCode值,其中s[i]是字符串的第i个字符,n是字符串的长度。...

    equals-hashcode-processor-1.0.0.zip

    "retry.zip"中的开源项目"equals-hashcode-processor-1.0.0"为我们提供了一个优雅的解决方案,通过这个库,我们可以轻松地为Scala Futures实现自动重试逻辑。 首先,我们需要理解Scala Futures的基础。Futures是...

Global site tag (gtag.js) - Google Analytics