hash冲突

本文详细介绍了Java中hashCode方法的工作原理及其实现方式,探讨了如何通过位运算优化hash值计算,并讨论了hashCode方法与equals方法的关系及其在HashMap中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值