最新这似乎是目前最实用的HashTable知识总结,你学会了吗?,9次Java面试经验总结

总结

这份面试题几乎包含了他在一年内遇到的所有面试题以及答案,甚至包括面试中的细节对话以及语录,可谓是细节到极致,甚至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!

某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!

成功只会留给那些有准备的人!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

哈希表关注的核心问题

  • 哈希函数如何设计
  • 如何解决hash冲突

对于不同的关键字得到了同一个hash地址,这种现象称为hash冲突(collision),形式化为:key1≠key2,f(key1)==f(key2),其中f为hash函数。

hash函数的设计原则

  • 一致性:如果a==b,则hash(a)==hash(b),这是java自定义类时必须需重写的hashcode方法原因。

  • 高效性:计算高效便捷,O(1),这也是使用动态数组,在适当的情况下resize的原因。

  • 均匀性哈希值的分布越均匀越好这就是取模法中模为质数的原因

整数转换为索引的方法:取模法

hashcode=val%M,其中M为一个质数。注意,公式中val为正整数,如果类型为int,可以先进行去除符号操作:val=val&ox7fffffff。因为从二进制的角度看ox7fffffff就是0和31个1,正好把符号位过滤掉。

任何对象都可以表示为整数。

  • 浮点数:在计算机内部都是用32位或者64位二进制表示,从整数的角度去解析这些位,就找到了浮点数对应的整数。
  • 字符串:字符串本质上可以理解为B(base)进制数,其中B可以是不同字符串的个数。例如26。也可以是任意设定的一个质数。
  • 例如:code=c*26^3+o*26^2+d*26^1+e*26^0
  • 例如:abcd=a*B^3+b*B^2+c*B^1+d*B^0

进制表示的形式简化以及编程实现:

hash(code)=(c*B^3+o*B^2+d*B^1+e*B^0)%M,可以表示为每一位乘以base,在加下一位

=((((c*B+o)*B+d)*B+e)%M,很重要,在java字符串的hashcode方法中B=31

=((((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) {//有套路,逐个字段比较

最后

腾讯T3大牛总结的500页MySQL实战笔记意外爆火,P8看了直呼内行

腾讯T3大牛总结的500页MySQL实战笔记意外爆火,P8看了直呼内行

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

收录**

需要这份系统化的资料的朋友,可以点击这里获取

  • 28
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值