java中的hashCode方法是将一个字符串转换成数字。
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;
}
然后将多个属性 乘以一个系数,再进行累加。
@Override
public int hashCode() {
// TODO Auto-generated method stub
return name.hashCode() * 37 + age;
}
HashMap中通过一些位运算来计算hash值
static int hash(int h) {
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
----------------------------
hashCode方法的存在是为了减少equals方法的调用次数,从而提高程序效率。
HashMap的put方法先比较hash值再用equals判断是否相同
如果hash值相同,equals不同,则代表着hash冲突,会覆盖冲突的hash值。
理解hash冲突的一个实际意义是
如果对象中的数据易变,则最好在equals方法和hashCode方法中不要依赖于该字段。
不要在put了一个对象后改变其hashCode中的属性
package com.tristan;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
class People {
private String name;
private int age;
public People(String name, int age) {
this.name = name;
this.age = age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return name.hashCode() * 37 + age;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
return this.name.equals(((People) obj).name) && this.age == ((People) obj).age;
}
}
public class HashConflict {
public static void main(String[] args) {
People p1 = new People("Jack", 12);
System.out.println(p1.hashCode());
HashMap<People, Integer> hashMap = new HashMap<People, Integer>();
hashMap.put(p1, 1);
p1.setAge(13);
System.out.println(hashMap.get(p1));
}
}
参考 http://www.cnblogs.com/dolphin0520/p/3681042.html
分享到:
相关推荐
### 链地址法解决Hash冲突 #### 一、引言 哈希表是一种非常高效的数据结构,通过哈希函数可以快速地定位到数据所在的存储位置。然而,在实际应用中,由于哈希函数的设计和数据分布的原因,经常会出现多个不同的...
HASH冲突的介绍和几种解决方案,用例子来讲述冲突的处理方式。
在“Hash-lookup.zip_hash冲突”这个主题中,我们主要探讨的是在使用哈希表进行查找时遇到的冲突问题以及解决策略。 哈希函数是哈希查找的核心,它的作用是将任意长度的关键字映射到固定大小的哈希表(也称为散列表...
如果你需要自定义哈希函数或解决冲突的方法,可以继承`std::hash`并重载相关方法,或者直接实现自己的哈希表类。 在实际应用中,选择哪种冲突解决方法取决于具体的需求,如空间效率、时间效率、负载因子等因素。在...
在这里,它是用来编译和调试mac hash冲突计算小工具的。wxWidgets是一个跨平台的GUI库,使得开发者可以使用C++编写出具有原生外观的用户界面,且在Windows、Linux和macOS等操作系统上运行。 源码中可能包含了以下几...
**链地址法处理Hash冲突** 在计算机科学中,哈希表是一种高效的数据结构,它通过哈希函数将数据映射到一个固定大小的数组中,从而实现快速的查找、插入和删除操作。然而,由于哈希函数的局限性,不同的键可能会映射...
Java 中的 Hash 冲突解决方法示例 Java 中的 Hash 冲突是一种常见的问题,Hash 表的实现中,Hash 冲突是不可避免的。 Hash 冲突是指两个或多个关键字的 Hash 值相同的情况。这种情况下,如何解决 Hash 冲突便成了一...
例如,选择合适的哈希函数以尽量减少冲突,以及在冲突不可避免时采用适当的冲突解决策略。此外,动态调整哈希表大小以适应数据量的变化也是必要的。当数据量增大导致冲突增多时,可以采用双倍扩容的方式增加哈希表...
例如,Karp-Rabin算法利用滚动哈希(Rolling Hash)减少比较次数。通过对要查找的字符串计算哈希值,并在主字符串中滑动窗口计算滚动哈希值,可以高效地检测匹配。这种方法将原本的时间复杂度从O(|s|*|t|)降低到O(|t...
哈希冲突是哈希表操作中常见的问题,由于哈希函数的非完美性质,不同的关键字可能会映射到相同的哈希地址,导致数据存取效率下降。解决哈希冲突的方法多种多样,下面我们将深入探讨其中的四种主要策略:开放地址法、...
计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习...
用线性探测法解决Hash冲突。设Hash函数为:Hash(Key)=[(Key的首字母序号)*100+(Key的尾字母序号)] Mod 41。关键字39个,参考C语言教材。 二、数据结构设计 ①关键字表的存储结构;②Hash表中的结点结构。频度、冲突...
发生Hash冲突用线性探测法解决。设Hash函数为: Hash(key)=[(key的第一个字母序号)*100+(key的最后一个字母序号)] MOD 41。 (2)用顺序表存储c语言中的关键字,把c源程序取出每个单词利用二分查找技术统计该程序...
《Hash表的构建和冲突解决》文档可能详细介绍了如何构建哈希表、各种哈希函数的设计思路,以及在实际编程中如何运用这些方法来有效地解决冲突。可能涉及的具体内容包括: - 哈希表的基本结构和操作(如插入、删除、...
统计C程序单词的个数 ——Hash技术 数据结构”是计算机程序设计的重要理论技术基础,本次...发生Hash冲突用线性探测法解决。设Hash函数为: Hash(key)=[(key的第一个字母序号)*100+(key的最后一个字母序号)] MOD 41
- Hash索引不支持范围查询和部分索引列的使用,在唯一列(unique columns)上使用时可能会遇到Hash冲突的问题。 三、WAL日志与数据恢复 - WAL日志是数据库ACID特性中重要的一环,它确保了数据的持久性和一致性。 - ...
仿真结果表明,该算法生成的Hash地址在10位地址空间内分布较为均匀,有效降低了Hash冲突的可能性。 在交换芯片地址表查找过程中,一般采用的地址表查询方法包括二分查找法、低位提取查找法、基于CAM(Content ...
Hash 冲突是指两个对象的哈希码相同,但对象的内容不同。HashMap 使用链表来解决 Hash 冲突问题。 * 在 JDK 1.7 中,HashMap 使用数组+链表来存储键值对,当链表过长时,查询效率非常低。 * 在 JDK 1.8 中,HashMap...
利用Hash技术统计C源程序中关键字的频度:扫描一个C源程序,用Hash表存储该程序中出现的关键字,...用线性探测法解决Hash冲突。设Hash函数为:Hash(Key)=[(Key的首字母序号)*100+(Key的尾字母序号)] Mod 41。关键字39个