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,相乘造成数据溢出的概率较小。
分享到:
相关推荐
那么,为什么使用31作为系数呢?首先,31是一个质数,它的特性是只有1和自己是因子。这使得它和其他数相乘后得到的结果比其他方式更容易产成唯一性,也就是hash code值的冲突概率最小。其次,31*N可以被编译器优化为...
为什么需要重写 hashCode()?因为我们需要确保对象的唯一性。如果我们不重写 hashCode(),那么对象的 hashCode 将会默认使用 Object 类中的 hashCode 方法,这样将会导致对象的存储位置不确定。 例如,如果我们有两...
本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式...
equals 方法和 hashCode 方法是 Java 语言中两个重要的方法,它们都是在 Object 类中定义的。equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java 的 Object 类中,equals 方法...
然而,如果我们定义两个 Integer 对象 integer1 和 integer2,并将它们赋值为 6,然后使用 == 号比较它们,结果将是 false。这是因为 integer1 和 integer2 是两个不同的对象,即使它们的值相同。 其次,equals ...
`hashCode()` 的作用是为对象生成一个唯一的整数值,这个值通常被用来快速定位对象在哈希表(如 `HashSet` 或 `HashMap`)中的位置。`hashCode()` 的设计必须满足以下条件: 1. 相等的对象必须具有相同的哈希码:...
当两个对象通过 `equals` 方法被判断为相等时,它们的 `hashCode` 必须也相等。但是,即使两个对象的 `hashCode` 相同,也不意味着它们一定相等。 #### 实现原理 1. **默认实现**:每个Java对象都有一个默认的 `...
2. **避免返回固定值**:不要在`hashCode`方法中总是返回一个固定的值,比如0,这会导致所有的对象都映射到同一个哈希桶中,从而降低哈希表的性能。 3. **考虑效率**:在实现`hashCode`时,应该尽可能地让不同的对象...
本文将详细介绍 hashCode() 和 equals() 的本质区别和联系,并探讨在创建 Java 类时如何定义这些方法。 hashCode() 方法 hashCode() 方法是 Object 类中的一个方法,它返回对象的哈希码值。哈希码值是一个整数,它...
在`DBObject.java`这个文件中,我们可以推测它可能定义了一个名为`DBObject`的类,该类可能代表某种数据库对象。在这个类中,很可能已经重写了`equals()`, `hashCode()` 和 `toString()` 方法,以便更好地处理对象的...
PPT浅析hashcode定义和作用;和简单的代码演示PPT.很简单的
这两个方法在Java中的`Object`类中定义,但为了正确地比较对象并处理集合(如HashSet或HashMap)时,通常需要重写它们。`equals`方法用于比较两个对象是否相等,而`hashCode`方法返回对象的一个整数值,用于在哈希表...
在这个例子中,`equals()`方法基于`name`和`age`属性来判断两个`Person`对象是否相等,而`hashCode()`方法也考虑到了这两个属性,以确保当两个对象相等时,它们的哈希码也相同。 #### 总结 `hashCode()`和`equals()...
在示例中,`Person` 类实现了 `Serializable` 接口,并且 `age` 字段被标记为 `transient`,这意味着在序列化过程中不会保存 `age` 的值。 序列化的实现代码如下: ```java // 序列化 ObjectOutputStream oos = ...
在C#编程语言中,`hashCode`是一个非常重要的概念,特别是在数据结构如哈希表(HashMap)中。`GetHashCode`方法是.NET框架中的一个关键组成部分,它为对象提供了一个整数值,这个值通常用于快速比较和定位对象。标题...
hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法。 使用hashCode()和equals() hashCode()方法被用来获取给定对象的整数。这个整数被用来确定对象被...
* 要找到生成同一个哈希值的2个不同输入,在一定时间范围内,是不可能的 正因为哈希值的这些特点,使得哈希算法应用在加密领域成为可能。哈希算法在加密领域的应用,源于哈希算法的不可逆性,对于用户输入的密码,...
两个相等的对象(根据`equals()`方法定义)必须具有相同的哈希码,因为这保证了它们在哈希表中会被放在相同的位置。 `equals()`方法是另一个关键成员,它用于判断两个对象是否表示同一个实体。默认的`equals()`方法...
hashCode方法的实现方式有多种,String类的hashCode方法就是一个典型的例子,它使用数学表达式s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]来计算hashCode值,其中s[i]是字符串的第i个字符,n是字符串的长度。...
"retry.zip"中的开源项目"equals-hashcode-processor-1.0.0"为我们提供了一个优雅的解决方案,通过这个库,我们可以轻松地为Scala Futures实现自动重试逻辑。 首先,我们需要理解Scala Futures的基础。Futures是...