这似乎是目前最实用的HashTable知识总结,你学会了吗?

本文介绍了如何在Java中自定义类的hashcode和equals方法,以确保哈希表的正确性,包括快速幂算法的应用和解决hash冲突的方法如链地址法。此外,还提及了与Java开发相关的面试题库,如MyBatis、ZooKeeper等技术的面试问题。

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

=((((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=hash
B+cls.hashCode();
hash=hash*B+name.hashCode();
return hash;
}

@Override
public boolean equals(Object obj) {//有套路,逐个字段比较
if(thisobj) return true;
if(obj
null)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>=upperTolN/M<lowerTol

实现自己的hashtable,采用TreeMap作为链接冲突元素的容器

都是先获得key索引,然后再获某个元素。TreeMap<K,V> map=hashtable[hash(key)]

更多关于hash冲突的办法

  1. 开放地址法。
  2. 再哈希法:rehashing.

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

面试题文档来啦,内容很多,485页!

由于笔记的内容太多,没办法全部展示出来,下面只截取部分内容展示。

1111道Java工程师必问面试题

MyBatis 27题 + ZooKeeper 25题 + Dubbo 30题:

Elasticsearch 24 题 +Memcached + Redis 40题:

Spring 26 题+ 微服务 27题+ Linux 45题:

Java面试题合集:

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值