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冲突的介绍和几种解决方案,用例子来讲述冲突的处理方式。
C++实现的hash冲突解决算法,有好几种解决方法
基于codeblocks wxwidgets 的Marvell mac hash冲突计算小工具及源码
Hash冲突的一般解决方案与字符串查找中hash的使用.docx
哈希表 相关概念、hash函数、hash冲突解决方案、代码示例
表头插入,使用链地址法处理冲突的哈希查找算法
主要介绍了java开放地址法和链地址法解决hash冲突的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
上篇文章 为什么哈希存取比较快?使用它需要付出什么代价 只是简单介绍了使用hash所带来的利与弊。并未涉及hash的技术细节,本文则着重学习一下如何解决哈希编址的冲突问题。
NULL 博文链接:https://128kj.iteye.com/blog/1683641
用线性探测法解决Hash冲突。设Hash函数为:Hash(Key)=[(Key的首字母序号)*100+(Key的尾字母序号)] Mod 41。关键字39个,参考C语言教材。 二、数据结构设计 ①关键字表的存储结构;②Hash表中的结点结构。频度、冲突...
发生Hash冲突用线性探测法解决。设Hash函数为: Hash(key)=[(key的第一个字母序号)*100+(key的最后一个字母序号)] MOD 41。 (2)用顺序表存储c语言中的关键字,把c源程序取出每个单词利用二分查找技术统计该程序...
统计C程序单词的个数 ——Hash技术 数据结构”是计算机程序设计的重要理论技术基础,本次...发生Hash冲突用线性探测法解决。设Hash函数为: Hash(key)=[(key的第一个字母序号)*100+(key的最后一个字母序号)] MOD 41
利用Hash技术统计C源程序中关键字的频度:扫描一个C源程序,用Hash表存储该程序中出现的关键字,...用线性探测法解决Hash冲突。设Hash函数为:Hash(Key)=[(Key的首字母序号)*100+(Key的尾字母序号)] Mod 41。关键字39个
发生Hash冲突用线性探测法解决。设Hash函数为: Hash(key)=[(key的第一个字母序号)*100+(key的最后一个字母序号)] MOD 41。 (2)、用顺序表存储c语言中的关键字,把c源程序取出每个单词利用二分查找技术统计该...
全域哈希原理与实现1-hash哈希介绍2-Universal hashing全域哈希法3-构造一个全域哈希H\mathcal{H}H4-python实现 1-hash哈希介绍 hash函数y=h(k)y=h(k)y=h(k),把任意长度的输入kkk通过散列算法hhh变换成固定长度的...
NULL 博文链接:https://eleopard.iteye.com/blog/1766890
MurmurHash算法由Austin Appleby创建于2008年,现已应用到Hadoop、libstdc 、nginx、libmemcached,Redis,Memcached,Cassandra,HBase,Lucene等开源系统。2011年Appleby被Google雇佣,随后Google推出其变种的...