=
((((c%M)*B+o)%M*B+d)%M*B+e)%M
,其余操作可以拿到括号里面去。(此性质快速幂算法中很常用)
int hash=0;
for(int i=0;i<s.length;i++){
hash=(hash*B+s.charAt(i))%M;
}
//java中B的是31,不在乎是否溢出,只要返回的是一个整数就OK,不知道M是什么,所以就没有出现M。
-
日期类型:考虑每个部分,每部分表示不同的权重(进制思维)。
-
Date: year,month,day,则
hash(date)=(((date.year%M)*B+date.month%M)*B+date.day)%M
-
类:分别将类的每一个字段当做B进制中的某一位。依据B进制数进行转换。
当将自定义的类作为hashmap和hashSet的Key时,必须重写hashcode方法和equal方法。
1.因为默认的hashcode()方法取对象的地址为基础获得的,而new()同一类的不同实例对象地址不同,使得hashcode的结果也不同,这就不满足一致性,例如,new Person(“小明”)两次,它们的hashcode不同,但这显然就不合理。
2.重写hashcode()只是为了获得正确的hash值,但当冲突了,还需要逐个字段进行比较才能确定是否相等,这就要求重写equal来完成,因为默认的equal就等于==
,含义为比较对象地址。
自定义hashcode和equals的实例
基本思路利用已有基本类型的包装类和String类的hashcode()
方法来生成我们的hashcode()
public class Student {
Integer grade;
Integer cls;
String name;
//省去无关代码
@Override
public int hashCode() {//套路:模仿String,Base取31
int B=31;
int hash=0;
hash=hashB+grade.hashCode();
hash=hashB+cls.hashCode();
hash=hash*B+name.hashCode();
return hash;
}
@Override
public boolean equals(Object obj) {//有套路,逐个字段比较
if(thisobj) return true;
if(objnull)return false;
if(this.getClass()!=obj.getClass()) return false;
Student another=(Student) obj;
return this.grade.equals(another.grade) &&
this.cls.equals(another.cls) &&
this.name.equals(another.name);//字符串比较相等,equals
}
}
hash冲突的解决方法:链地址法
数组中每个元素保留的是地址。数组中每个元素的位置是N%M
去掉符号位:hashcode(k1)&0X7FFFFFFF
动态空间(扩容和缩容)处理N/M>=upperTol
和N/M<lowerTol
实现自己的hashtable,采用TreeMap作为链接冲突元素的容器
都是先获得key索引,然后再获某个元素。TreeMap<K,V> map=hashtable[hash(key)]
。
更多关于hash冲突的办法
- 开放地址法。
- 再哈希法:rehashing.
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

最后
面试题文档来啦,内容很多,485页!
由于笔记的内容太多,没办法全部展示出来,下面只截取部分内容展示。
1111道Java工程师必问面试题
MyBatis 27题 + ZooKeeper 25题 + Dubbo 30题:
Elasticsearch 24 题 +Memcached + Redis 40题:
Spring 26 题+ 微服务 27题+ Linux 45题:
Java面试题合集:
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!**